2016-05-24 4 views
0

Mein Problem ist ähnlich dem der Frage in this link. Ich muss mehrere Slices oder eine Struktur von Golang zum Ajax-Erfolgsblock zurückgeben. Ich habe versucht, mein Slice in JSON zu marshallen, aber es wird in Ajax als String empfangen. Ich muss es als Array erhalten. Ist es möglich, mehrere Arrays oder eine Struktur wie diese zu senden?Golang, Ajax - Wie man Scheiben oder Struktur in einer Erfolgsfunktion zurückgibt?

Mein Code:

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

Meine Ajax:

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

Vielen Dank im Voraus.

+0

versuchen Sie es mit 'dataType: 'json'' anstelle von' dataType:' html'' –

+0

@AH jetzt Erfolg Block erhält nichts, was ich denke. Ich habe eine if (data == "") Bedingung mit einigen Alarm-Boxen, keine Warnung in, wenn noch anders geantwortet. –

+0

Arjun, ich habe eine Antwort geschrieben, da es zu lange ist, um sie zu kommentieren. Sehen Sie, ob es hilft. Und benutze die JavaScript-Konsole deines Browsers zum Debuggen. –

Antwort

3

Der dataType Parameter Ihrer Ajax-Anfrage sollte json sein, da Sie JSON-Daten vom Server erwarten. Aber wenn Ihr Server nicht mit gültigem JSON antwortet, wird die Ajax-Anfrage zu einem Fehler führen. Überprüfen Sie die JavaScript-Konsole Ihres Browsers auf Fehler.

Von dem, was Sie gerade im Controller machen, wird es definitiv zu ungültiger JSON-Antwort führen. Siehe unten.

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"]` 

Dies führt zu Senden ["foo","bar"]["baz","qux"] Das ist nur zwei JSON-Array Strings zusammen angehängt. Es ist nicht gültig.

Was Sie wahrscheinlich an den Browser senden möchten, ist dies: [["foo","bar"],["baz","qux"]].

Das ist ein Array von zwei Arrays. Sie können dies tun, um es vom Server zu senden.

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

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

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

Und in der JavaScript-Seite,

$.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 
     } 
}); 
2

Die Antwort von @AH funktioniert wirklich gut für mehrere Scheiben schneiden. Nun, wenn Sie ein Struct wollen, sollten Sie ein wenig Code ändern:

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

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

Wie here Alarm erklärt nur Strings anzeigen und data ist ein Objekttyp von JavaScript. Sie müssen also JSON.stringify verwenden, um das Objekt in JSON-String zu verwandeln.

Verwandte Themen