我目前无法找到解决此问题的方法。如果我有一个结构,我想用http.quest中的json填充,我无法告诉例如实际传递了什么值的某些值。例如,如果我传入一个空的json对象并在一个看起来像这样的结构上运行json.Decode ...
var Test struct {
Number int `json:"number"`
}
我现在有一个json对象,据说传递了一个数字键和一个零值,实际上我宁愿让这个返回任何东西。是否提供了另一种实际上允许我查看传入JSON的方法。
很抱歉,我一直试图弄清楚这几天是怎么回事,这让我疯了。
感谢您的帮助。
编辑:
我这是为了准确描述我所说的http://play.golang.org/p/aPFKSvuxC9
答案 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)。这是当前的实施。baz
,则返回错误。如果缺少baz
是正常行为,那将非常不方便。另一种可能性是使用指针,并使用默认值nil
,其精神与我所讨论的默认值相同,但如果你的json文件可以填充{{1值:您将无法区分json文件中的值,但设置为null
,以及不在json中的值,并以null
作为默认值进行解组。
但是,此解决方案可能适合您:为什么不使用nil
而不是struct
? map[string]interface{}
函数不必向非现有字段添加默认值,并且能够从json文件中检索任何类型的数据。
Unmarshall