如何使用 Json.Net 反序列化只读列表

Nei*_*l N 5 c# serialization json.net deserialization

我有一个带有内部列表的类。我不希望这个类的用户能够直接与列表交互,因为我希望在返回它之前保持它的排序并运行一个计算(这取决于顺序)。

我暴露

AddItem(Item x) 
Run Code Online (Sandbox Code Playgroud)

和一个

IEnumerable<Item> Items
{
     get { // returns a projection of internal list }
}
Run Code Online (Sandbox Code Playgroud)

序列化工作正常,但反序列化使列表为空。我想这是因为我没有二传手。所以我添加了一个允许你设置列表的,但前提是内部列表为空。但这并没有解决问题,事实证明 NewtonSoft 没有调用 setter,它只调用 getter 来获取列表,然后将每个项目添加到其中,因为我的 getter 返回了一个投影列表,所以这些项目被添加反序列化完成后立即处理的对象。

我如何保持对我的列表的只读访问,同时允许一些简单的反序列化?

Wot*_*tuu 6

对我有用的是以下内容:

[JsonProperty(PropertyName = "TargetName")]
private List<SomeClass> _SomeClassList { get; set; }
public IReadOnlyList<SomeClass> SomeClassList
{
    get
    {
        return this._SomeClassList.AsReadOnly();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,创建一个函数来阻止SomeClassList被序列化:

public bool ShouldSerializeSomeClassList() { return false; }
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.newtonsoft.com/json/help/html/ConditionalProperties.htm(感谢 Peska)

  • 我认为这应该是公认的答案。另外,您可以简单地在公共集合上使用“[JsonIgnore]”属性来防止 Json.NET 反序列化 ReadOnlyCollection。 (6认同)