当前位置: 首页 > 面试题库 >

Go:json.Unmarshal何时会返回结构错误?

楚丰羽
2023-03-14
问题内容

假设我有一个像

type A struct{
  name string`json:"name"`
}

然后在主要我有代码

var jsonString string = `{"status":false}`
var a A
error := json.Unmarshal([]byte(jsonString),&a)

显然,无论json格式不同,上述代码都会产生nil错误。Go中的json.Unmarshal()什么时候返回错误?


问题答案:

如果源中的值与目标中的值不对应,则JSON解码器不会报告错误。例如,如果源包含“状态”字段,这不是错误,但目标没有。

在其他情况下,Unmarshal函数确实会返回错误:

语法错误

type A struct {
    Name string `json:"name"`
}
data = []byte(`{"name":what?}`)
err = json.Unmarshal(data, &a)
fmt.Println(err)  // prints character 'w' looking for beginning of value

类型不匹配

data := []byte(`{"name":false}`)
type B struct {
  Name string `json:"name"`
}
var b B
err = json.Unmarshal(data, &b)
fmt.Println(err) // prints cannot unmarshal bool into Go value of type string

游乐场的例子



 类似资料:
  • 问题内容: 为什么当我们使用struct引用结构时,Go似乎会返回的新副本,而不是返回原始的相同地址?这可能是我的误解,所以我要求澄清 输出量 去操场 问题答案: 当你写 您正在复制(dereferences )指向的struct的值。它类似于: 所以是一个类型的新变量,被初始化为的值。这将导致具有不同的内存地址。 请注意,如果是type ,则while 是type 。但是它们是不同的值。更改of

  • 问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要

  • 问题内容: 我有一个包含一个结构的结构,并且我想序列化为一个对象: 如何最好地将Packet序列化为,以及如何最好地对其进行反序列化? 使用 只给了我名称和数据的指针。我正在探索,但是随后我必须将Packet作为对象,并且我希望将其保留为结构。 干杯 尼克 问题答案: 没有真正得到任何反馈,这是我最终得到的解决方案: 我的结构的制造和功能 更改为,以便在32位和64位平台上具有相同的大小 具有一个

  • 问题内容: 它应该返回1000,但是为什么返回5? 问题答案: 是。如果你用它乘,它会溢出类型(因为这的最大值可容纳是比少了很多),你会得到的。 然后,将结果除以,您将得到。 为了解决此问题,您需要明确指定乘法的结果将是-这是因为Java中的所有数字运算符都会产生整数,除非明确指示要产生其他数字类型。 只需在一些操作数上附加a 就足够了:

  • 问题内容: 当我比较具有相同下划线字符串的两个StringBuilder对象时,即使value应该为true也会返回。 问题答案: 这是因为不会覆盖类中的方法。 您将必须将两个对象都转换为,然后进行比较 这将为您提供正确的结果。显然,您必须注意 null 检查等。 根据合同,如果覆盖equals,则也必须覆盖它们,但是由于可变,因此其值的任何更改都会影响对象的哈希码。如果用作键,可能会导致存储的值

  • 我必须创建聚合,计算日期范围中包含的文档数量。我的查询如下所示: 间隔:604800000等于7天。 结果,我重新强调了这些: 您可以要求我的buckets从29/12/2016开始,但作为范围查询,不包括此日期。我希望我的桶应该从01/01/2017开始,正如我在范围查询中指出的那样。此问题仅发生在间隔天数大于1的查询中。在任何其他间隔的情况下,它工作得很好。我试了一天,几个月和几个小时,效果很