在Revel(Golang)中自动解析参数JSON

时间:2014-10-29 04:29:39

标签: json parameters go httprequest revel

当内容类型为“application / json”时,Revel不会解析JSON参数。

如何执行此操作?

示例:

POST http://localhost:9000/foundations函数中的

Foundations.Create。 在此函数中,我使用fmt.Println("Params :", c.Params)来检查参数

Ruby POST JSON数据

#!/usr/bin/env ruby
require "rubygems"
require "json"
require "net/https"

uri = URI.parse("http://localhost:9000/foundations")
http = Net::HTTP.new(uri.host, uri.port)

header = { "Content-Type" => "application/json" }

req = Net::HTTP::Post.new(uri.path, header)
req.body = { 
  "data" => "mysurface"
}.to_json()

res = http.start { |http| http.request(req) }

调试打印是 Params : &{map[] map[] map[] map[] map[] map[] []}

当我没有使用“application / json”时: curl -F 'data=mysurface' http://127.0.0.1:9000/foundations

印刷品是: Params : &{map[data:[mysurface]] map[] map[] map[] map[data:[mysurface]] map[] []}

1 个答案:

答案 0 :(得分:2)

问题在于,使用json,Revel无法像对待"普通"那样真正地处理它。发布请求。通常,它可以将每个参数绑定到map[string]string对象中。但是使用JSON,它必须能够处理数组和嵌套对象,如果事先不知道JSON的结构将会是什么,就没有好办法。

所以解决方案就是自己处理它 - 你应该知道期望哪些字段,所以用这些字段创建一个struct,并在其中json.Unmarshal

import (
    "encoding/json"
    "fmt"
)

type Surface struct {
    Data string `json:"data"` //since we have to export the field
                              //but want the lowercase letter
}

func (c MyController) Action() revel.Result {
    var s Surface
    err := json.Unmarshal([]byte(c.Request.Body), &s)    
    fmt.Println(s.Data) //mysurface
}

如果您不想使用json:"data"代码或不想导出字段,您也可以编写自己的UnmarshalJSON函数

type Surface struct {
    data string `json:"data"` //can use unexported field
                              //since we handle JSON ourselves
}

func (s *Structure) UnmarshalJSON(data []byte) error {
    if (s == nil) {
        return errors.New("Structure: UnmarshalJSON on nil pointer")
    }
    var fields map[string]string
    json.Unmarshal(data, &fields)    
    *s.data = fields["data"]
    return nil
}