我发布了以下json字符串:
{'foods':[{'vName':'bean','color':'green','size':'small'},
{'vName':'carrot','color':'orange', 'size':'medium'}]}
我使用Restangular发布到Go,接收功能是:
func CreateFoods(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
var food Food //this needs to be an array or something?
dec := json.NewDecoder(r.Body)
dec.Decode(&food)
}
我的食物结构:
type Food struct{
VName string `json:"vName"`
Color string `json:"color"`
Size string `json:"size"`
}
我已经将这个例程用于我发布单个实体的情况,但现在我想发布多个实体,而我无法弄清楚如何将这个json示例映射到多个实体。 此外,我正在尝试“看到”JSON POST,看到JSON字符串,然后如果必须,我可以使用字符串来制作实体。我无法弄清楚如何从http.Request获取JSON字符串。
答案 0 :(得分:2)
添加:
// You might use lowercase foods since it is maybe not something you want to export
type Foods struct {
Foods []Food
}
解码时请使用:
var foods Foods
dec.Decode(&foods)
要将响应的正文视为字符串:
bytes, err := ioutil.ReadAll(r.Body)
fmt.Println(string(bytes))
小细节:在最后两行之后,您现在读取了正文内容。然后你应该解码json而不是使用json.NewDecoder和Decode而是使用json.Unmarshal。 CreateFoods()的完整示例,以防止混淆:
bytes, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println("error reading body")
return
}
fmt.Println(string(bytes))
var foods Foods
json.Unmarshal(bytes, &foods)
希望它有效,没有测试,让我知道!
答案 1 :(得分:0)
如果你有一个io.Reader
,处理解码json的正确方法是使用json.NewDecoder
,使用ioutil.ReadAll
然后json.Unmarshal
很慢,并创建了许多不需要的缓冲区。
要处理像json示例这样的数组,您需要创建一个这样的结构:
type Foods struct {
Foods []Food `json:"foods"`
}
但是如果json只是一个数组[{'vName':'bean','color':'green','size':'small'} {'vName':'carrot','color':'orange', 'size':'medium'}]
,你可以使用:
type Foods []Food
type Food struct {
VName string `json:"vName"`
Color string `json:"color"`
Size string `json:"size"`
}
func CreateFoods(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
var food Foods //this needs to be an array or something?
dec := json.NewDecoder(r.Body)
dec.Decode(&foods)
}