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


属性

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

相关内容

  • 没有找到相关文章

最新更新