2016-04-07 12 views
-1

Ich habe folgende json:Json Decodier-/unmarshal in golang

{"results": 
[{"columns":["room_id","player_name","player_ip"], 
    "types":["integer","text","text"], 
    "values":[[1,"alice","127.0.0.1"] 
      [1,"bob","127.0.0.1"]], 
    "time":0.00018839100000000002}]} 

die Werte eine beliebige Anzahl von Elementen haben können in sie [].

type queryResults struct { 
     Results []struct { 
      Columns []string `json:"columns"` 
      Types []string `json:"types"` 
      Values []struct { 
       Room_id int 
       Player_name string 
       Player_ip string 
      } `json:"values"` 
      Time float64 `json:"time"` 
     } `json:"results"` 
    } 

Code::

//jsonString is the string input to Unmarshal 
resultjson := queryResults{} 
json.Unmarshal([]byte(jsonString), &resultjson) 
fmt.Printf("%+v",resultjson) 

Stromausgang:

{Results: 
[{Columns:[room_id player_name player_ip] 
    Types:[integer text text] 
    Values:[{room_id:0 player_name: player_ip:} 
      {room_id:0 player_name: player_ip:}] 
    Time:0.00018839100000000002}]} 
Wenn ich versuche, die json in eine Struktur zu entpacken, wird die "Werte" Tag nicht richtig

Struktur analysiert erhalten

Erwartete Ausgabe:

{Results: 
    [{Columns:[room_id player_name player_ip] 
     Types:[integer text text] 
     Values:[{room_id:1 player_name:alice player_ip:127.0.0.1} 
       {room_id:1 player_name:bob player_ip:127.0.0.1}] 
     Time:0.00018839100000000002}]} 
+0

Exportfelder. 'json.Unmarshal' setzt nur exportierte Felder. 'struct { RoomId int PlayerName Zeichenfolge PlayerIp Zeichenfolge }' –

+0

@AH Ich versuchte es gerade jetzt, aber die gleiche Ausgabe. Bearbeiten Sie auch die Frage – Karan

+0

bemerkte nicht, dass Sie mit einem Array arbeiten. Eine Antwort hinzugefügt. –

Antwort

2

Json Arrays entordnet in Go Scheiben oder Arrays werden sollte. Sieht aus wie Sie die Arrays innerhalb values zu einem struct

"values": [[1,"alice","127.0.0.1"], [1,"bob","127.0.0.1"]]

Above Array unmarshal von Arrays versuchen entordnet in eine Go Scheibe Scheiben werden sollte.

Versuch,

type queryResults struct { 
    Results []struct { 
     Columns []string `json:"columns"` 
     Types []string `json:"types"` 
     Values [][]interface{} `json:"values"` 
     Time float64 `json:"time"` 
    } `json:"results"` 
} 

in Go Playground

Und Fehler nicht ignorieren. Wenn Sie versucht haben,

err := json.Unmarshal([]byte(jsonString), &resultjson) 
if(err != nil){ 
    fmt.Println(err) 
} 

können Sie den Fehler gesehen haben.

2

Das Problem ist, dass Ihre Strukturdefinition erwartet, dass "Werte" ein Array von Objekten enthalten, aber Ihr tatsächliches JSON ein Array von Arrays enthält. Wenn Sie das Ergebnis von json.Unmarshal() überprüfen, wird ein Fehler angezeigt. anprobieren golang playground

error json: cannot unmarshal array into Go value of type struct { Room_id int; Player_name string; Player_ip string } 

Soweit ich weiß, dass Sie diese direkt in die Struktur nicht zuordnen können, müssen Sie es in ein Array lesen dann verarbeiten sie in Ihre letzte Art veröffentlichen. Hier ist ein example, die erfolgreich die json analysiert [die Post-Parsing-Umwandlung für den Leser als Übung]

{Results:[{Columns:[room_id player_name player_ip] 
      Types:[integer text text] 
      Values:[[1 alice 127.0.0.1] [1 bob 127.0.0.1]] 
      Time:0.00018839100000000002}]} 
Verwandte Themen