使用http.Request和Restangular在Go中查看JSON POST

时间:2014-08-24 18:57:16

标签: rest go restangular

我发布了以下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字符串。

2 个答案:

答案 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)
}