1

我的问题类似于此链接中的问题。我需要将多个切片或一个结构从 golang 返回到 ajax 成功块。我试图将我的切片编组为 JSON,但它在 ajax 中作为字符串接收。我需要将它作为数组接收。是否可以发送多个数组或这样的结构?

我的代码:

b, _ := json.Marshal(aSlice)      // json Marshal
c, _ := json.Marshal(bSlice)
this.Ctx.ResponseWriter.Write(b) // Beego responsewriter
this.Ctx.ResponseWriter.Write(c)

我的阿贾克斯:

$.ajax({
        url: '/delete_process',
        type: 'post',
        dataType: 'html',
        data : "&processName=" + processName,
        success : function(data) {
            alert(data);
            alert(data.length)
        }
});

提前致谢。

4

2 回答 2

4

您的 ajax 请求的dataType参数应该json与您期望来自服务器的 JSON 数据一样。但是,如果您的服务器没有以有效的 JSON 响应,则 ajax 请求将导致错误。检查浏览器的 JavaScript 控制台是否有错误。

从您当前在控制器中所做的事情来看,它肯定会导致无效的 JSON 响应。见下文。

aSlice := []string{"foo", "bar"}
bSlice := []string{"baz", "qux"}

b, _ := json.Marshal(aSlice) // json Marshal
c, _ := json.Marshal(bSlice)

this.Ctx.ResponseWriter.Write(b) // Writes `["foo","bar"]`
this.Ctx.ResponseWriter.Write(c) // Appends `["baz","qux"]`

这导致发送["foo","bar"]["baz","qux"]Thats 只是两个附加在一起的 JSON 数组字符串。它无效。

您可能想要发送到浏览器的是:[["foo","bar"],["baz","qux"]].

那是两个数组的数组。您可以这样做以从服务器发送它。

aSlice := []string{"foo", "bar"}
bSlice := []string{"baz", "qux"}

slice := []interface{}{aSlice, bSlice}

s, _ := json.Marshal(slice) 
this.Ctx.ResponseWriter.Write(s) 

在javascript方面,

$.ajax({
        url: '/delete_process',
        type: 'post',
        dataType: 'json',
        data : "&processName=" + processName,
        success : function(data) {
            alert(data);
            alert(data[0]);    // ["foo","bar"]
            alert(data[1]);    // ["baz","qux"]
            alert(data.length) // 2
        }
});
于 2016-05-24T13:04:23.697 回答
2

@AH 的答案非常适用于多个切片。现在如果你想要一个 Struct 你应该改变你的代码:

 package controllers

import "github.com/astaxie/beego"
import "encoding/json"


type Controller2 struct {
    beego.Controller
}

type Controller2Result struct {
    Accommodation []string
    Vehicle []string
}

func (this *Controller2) Post() {
   var result Controller2Result

   aSlice := []string{"House", "Apartment", "Hostel"}
   bSlice := []string{"Car", "Moto", "Airplane"}
   result.Accommodation = aSlice
   result.Vehicle = bSlice

   s, _ := json.Marshal(result) 
   this.Ctx.ResponseWriter.Header().Set("Content-Type", "application/json")
   this.Ctx.ResponseWriter.Write(s) 

}

阿贾克斯

  $.ajax({
           url: '/Controller2',
           type: 'post',
           dataType: 'json',
           //data : "&processName=" + processName,
           success : function(data) {
              alert(JSON.stringify(data));
           }
         });

这里解释的如何alert 只能显示字符串,data是 JavaScript 的对象类型。因此,您必须使用JSON.stringify将对象转换为 JSON-String。

于 2016-05-24T18:28:03.487 回答