go encoding/json:澄清当多个项目匹配相同字段时会发生什么

vkc1a9a2  于 3个月前  发布在  Go
关注(0)|答案(5)|浏览(45)

在encoding/json中,我添加了一个测试:

func TestUnmarshalCase(t *testing.T) {
	var v struct {
		Dist string `json:"dist"`
	}

	Unmarshal([]byte(`{"dist": "ok", "Dist": "KO"}`), &v)
	t.Logf("%+v", v)

	Unmarshal([]byte(`{"Dist": "ok", "dist": "KO"}`), &v)
	t.Logf("%+v", v)
}

打印

x_test.go:13: {Dist:KO}
    x_test.go:16: {Dist:KO}

注解说"优先选择"精确匹配,但是如果有多个字段匹配,却没有说明会发生什么。这是一个奇怪的情况,但清晰度会很好。我原本以为精确匹配总是会获胜。

4jb9z9bj

4jb9z9bj2#

我非常清楚这个问题,遗憾的是。请参阅 #14750 ,这个问题可能是一个重复的问题。我在不产生性能或内存成本的情况下尝试修复这个问题的方法是 https://go-review.googlesource.com/c/go/+/224079 ,它已经陷入了一段时间的审查僵局:)

eyh26e7m

eyh26e7m3#

这个问题的核心在于我们是否希望优先进行流式解码,还是为了执行精确匹配而缓存JSON对象的所有成员。前者具有显著更好的性能,而后者可能更符合用户的期望。

j8yoct9x

j8yoct9x4#

请在此处ping一下。看起来这在1.17版本中也无法使用。
@mvdan 看起来PR已经准备好了,有一个问题是1%的性能是否可以接受,对吗?

watbbzwu

watbbzwu5#

PR尚未准备好,存在冲突,而且Joe提出的一些边缘情况需要额外的工作。

相关问题