2016-12-03 46 views
2

我測試瞭如何從我正在使用的API解組json響應。轉:JSON輸入的意外結束和json.Unmarshal返回nil值

json看起來像下面這樣;

body := []byte(`[ 
    {"name":"Name1", "value":100.00}, 
    {"name":"Name2", "value":200.00} 
]`) 

我搜索周圍的各種方式來做到這一點,但未能得到這個工作。 unmarshal返回零值。我還收到一個錯誤「JSON輸入的意外結束」(我已經刪除了示例中的錯誤處理)。

完整的代碼示例 - https://play.golang.org/p/VMdWuAm6HS

參考:

  1. https://godoc.org/encoding/json#RawMessage
  2. Golang json Unmarshal "unexpected end of JSON input"
  3. How to unmarshal json into interface{} in golang?

回答

1

你輸入JSON可以用一個簡單的[]Obj,其中建模是你的類型:

type Obj struct { 
    Name string `json:"name"` 
    Value float32 `json:"value"` 
} 

沒有別的要求,真正做到:

body := []byte(`[ 
    {"name":"Name1", "value":100.00}, 
    {"name":"Name2", "value":200.00}]`) 

var res []Obj 
err := json.Unmarshal(body, &res) 
fmt.Printf("%#v\n%v\n", res, err) 

輸出包含從輸入JSON(嘗試在Go Playground)數據:

[]main.Obj{main.Obj{Name:"Name1", Value:100}, main.Obj{Name:"Name2", Value:200}} 
<nil> 

回到您的代碼:

你要去哪裏,錯的是你使用這個模型:

type Obj struct { 
    Name string `json:"name"` 
    Value float32 `json:"value"` 
} 

type Result struct { 
    Data json.RawMessage 
} 

var res []Result 

但這res變量將模擬以下JSON:

[ 
    {"Data":{"name":"Name1", "value":100.00}}, 
    {"Data":{"name":"Name2", "value":200.00}} 
] 

我覺得你可以看到其中的差別:的元素這裏的數組是帶有"Data"字段的JSON對象,然後使用您的Obj進行建模。然後使用您的原始解析代碼正確解析此輸入JSON,您可以在Go Playground上試用它:

[{{"name":"Name1", "value":100.00}} {{"name":"Name2", "value":200.00}}] 
&main.Obj{Name:"Name1", Value:100} 
&main.Obj{Name:"Name2", Value:200} 
+0

感謝您的快速響應! – multiversed