gpt4 book ai didi

javascript - Json.Net 中 JSON 中引用属性顺序的问题

转载 作者:行者123 更新时间:2023-11-27 22:55:32 25 4
gpt4 key购买 nike

属性的顺序未定义,因此我希望 JSON 中属性的顺序也不会定义。但是,我发现 Newtonsoft.Json 在引用时需要一定的顺序(我正在使用 PreserveReferencesHandling = PreserveReferencesHandling.All)。它期望 $id 属性是 JSON 中第一个出现的属性。

我通过以下测试得出了这个结论

string cyclicJson1 = "{\"FirstChild\":{\"OtherChild\":{\"OtherChild\":{\"$ref\":\"1\"},\"Parent\":{\"$ref\":\"0\"},\"$id\":\"2\"},\"Parent\":{\"$ref\":\"0\"},\"$id\":\"1\"},\"SecondChild\":{\"$ref\":\"2\"},\"$id\":\"0\"}\"";

无法通过 Newtonsoft.Json 正确反序列化(某些引用是 null ,但不应该),如下所示:

string cyclicJson2 = "{\"$id\": \"0\",\"FirstChild\": {\"$id\": \"1\",\"OtherChild\": {\"$id\": \"2\",\"OtherChild\": {\"$ref\": \"1\"},\"Parent\": {\"$ref\": \"0\"}},\"Parent\": {\"$ref\": \"0\"},},\"SecondChild\": {\"$ref\": \"2\"}}";

唯一的区别是我手动将 $id 属性向前移动,使其成为每个对象的第一个元素。

这些类的定义如下:

class CycleTestParent
{
public CycleTestChild FirstChild { get; set; }
public CycleTestChild SecondChild { get; set; }
public CycleTestParent()
{
FirstChild = new CycleTestChild();
SecondChild = new CycleTestChild();
}
}

private class CycleTestChild
{
public CycleTestParent Parent { get; set; }
public CycleTestChild OtherChild { get; set; }
}
<小时/>

有没有一种方法可以让我使用 Newtonsoft.Json 而不必假设 $id 属性始终首先出现?除了手动使用 JSON 字符串之外,还有其他方法吗?

最佳答案

您需要将 MetadataPropertyHandling 设置为 MetadataPropertyHandling.ReadAhead:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
};

默认情况下,出于性能原因,元数据属性应位于对象 JSON 的开头。使用此属性,您可以更改解析器行为以在对象 JSON 内的任何位置查找它们。

关于javascript - Json.Net 中 JSON 中引用属性顺序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com