的顺序没有定义,所以我希望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 中的任何位置查看它们。