我的问题类似于this link.中的问题,我需要从golang返回多个 slice 或结构到ajax成功块。我试图将 slice 打包为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:
$.ajax({
        url: '/delete_process',
        type: 'post',
        dataType: 'html',
        data : "&processName=" + processName,
        success : function(data) {
            alert(data);
            alert(data.length)
        }
});

提前致谢。

最佳答案

Ajax请求的dataType参数应为json,因为您希望从服务器获取JSON数据。但是,如果您的服务器未使用有效的JSON进行响应,则ajax请求将导致错误。检查浏览器的JavaScript控制台是否有错误。

从您当前在 Controller 中执行的操作来看,它肯定会导致无效的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"]那仅是两个附加在一起的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
        }
});

07-27 17:55