Golang Null类型和json.Decode()

时间:2014-07-17 20:28:37

标签: json go

我目前无法找到解决此问题的方法。如果我有一个结构,我想用http.quest中的json填充,我无法告诉例如实际传递了什么值的某些值。例如,如果我传入一个空的json对象并在一个看起来像这样的结构上运行json.Decode ...

var Test struct {
        Number int `json:"number"`
}

我现在有一个json对象,据说传递了一个数字键和一个零值,实际上我宁愿让这个返回任何东西。是否提供了另一种实际上允许我查看传入JSON的方法。

很抱歉,我一直试图弄清楚这几天是怎么回事,这让我疯了。

感谢您的帮助。

编辑:

我这是为了准确描述我所说的http://play.golang.org/p/aPFKSvuxC9

2 个答案:

答案 0 :(得分:8)

您可以使用指针example

func main() {
    var jsonBlob = []byte(`[
        {"Name": "Platypus"},
        {"Name": "Quoll",    "Order": 100}
    ]`)
    type Animal struct {
        Name  string 
        Order *int   
    }
    var animals []Animal
    err := json.Unmarshal(jsonBlob, &animals)
    if err != nil {
        fmt.Println("error:", err)
    }
    for _, a := range animals {
        if a.Order != nil {
            fmt.Printf("got order, %s : %d\n", a.Name, *a.Order)
        }
    }
}

答案 1 :(得分:0)

我不知道如何通过向struct函数提供Unmarshal来实现此目的。例如,使用以下结构:

type A struct {
    Hello string
    Foo   int
    Baz   string
}
var a A
json.Unmarshal(data, &a)

即使进行Unmarshal的另一种实现,也只有两种(简单)可能性:

  • 如果baz不在json数据中,请将a.Baz设置为与其类型兼容的默认值:空字符串(如果是整数,则为0)。这是当前的实施。
  • 如果json数据中没有baz,则返回错误。如果缺少baz是正常行为,那将非常不方便。

另一种可能性是使用指针,并使用默认值nil,其精神与我所讨论的默认值相同,但如果你的json文件可以填充{{1值:您将无法区分json文件中的值,但设置为null,以及不在json中的值,并以null作为默认值进行解组。

但是,此解决方案可能适合您:为什么不使用nil而不是structmap[string]interface{}函数不必向非现有字段添加默认值,并且能够从json文件中检索任何类型的数据。

Unmarshall