Golang, Ajax - Как вернуть фрагменты или структуру в функции успеха?

Моя проблема аналогична вопросу в эта ссылка. Мне нужно вернуть несколько фрагментов или структуру из 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)
        }
});

Заранее спасибо.


person Arjun Ajith    schedule 24.05.2016    source источник
comment
попробуйте использовать dataType: 'json' вместо dataType: 'html'   -  person Aruna Herath    schedule 24.05.2016
comment
@AH теперь я думаю, что блок успеха ничего не получает. Я поставил условие if(data == ) с некоторыми окнами предупреждений, ни предупреждение ни в if, ни в else не ответило.   -  person Arjun Ajith    schedule 24.05.2016
comment
Арджун, я отправил ответ, так как он слишком длинный, чтобы комментировать. Посмотрите, поможет ли это. И используйте консоль javascript вашего браузера для отладки.   -  person Aruna Herath    schedule 24.05.2016


Ответы (2)


Параметр dataType вашего запроса ajax должен быть 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"] Это всего лишь две строки массива 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
        }
});
person Aruna Herath    schedule 24.05.2016

Ответ @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));
           }
         });

Как объясняется здесь, предупреждение может отображать только строки, а dataявляется типом объекта JavaScript. Поэтому вам нужно использовать JSON.stringify, чтобы превратить объект в JSON-String.

person Carlos Andrés García    schedule 24.05.2016