【问题标题】:Deserialize JSON object that has the same object as member in it反序列化与其中成员具有相同对象的 JSON 对象
【发布时间】:2015-07-23 22:23:08
【问题描述】:

我在反序列化具有如下结构的 json 时遇到问题。

public class Entity
{
    public int Id;
    public string EntityName;
    private List<Entity> _items;

    //Sub entities
    public IReadOnlyList<Entity> Items
    {
        get{
               return _items;
           }
    }
}

在调试模式下, 我可以通过 JSON Visualizer 看到 Items > 0(如下图所示),但是当我尝试反序列化时,我总是得到 Items count = 0

我尝试使用以下语句,但仍然没有运气。

var json = await response.GetContentAsync<string>();

试试 1

var deserializedList = JsonConvert.DeserializeObject<IEnumerabld<Entity>>json);

试试 2

var settings = new JsonSerializerSettings{MaxDepth = 5};
var deserializedList = JsonConvert.DeserializeObject<IReadOnlyList<Entity>>(json, settings);

对此的任何帮助将不胜感激。

【问题讨论】:

  • 你有这个IReadOnlyList,这使得序列化程序无法向它添加一些东西。

标签: c# json json-deserialization


【解决方案1】:

第一个选项是IList&lt;Entity&gt;,但如果想保留它为IReadOnlyList&lt;Entity&gt;,你可以通过为其提供一个setter来做到这一点 -

    public IReadOnlyList<Entity> Items
    {
        get
        {
            return _items;
        }
        set
        {
            _items = _items ?? new List<Entity>();
            if (value == null)
                return;
            _items.AddRange(value);
        }
    }

这是一个例子 -

【讨论】:

    【解决方案2】:

    因为您的公共属性是IReadOnlyList,反序列化程序无法在那里设置值。要解决此问题,您需要将[JsonProperty] 属性应用于_items 字段

    public class Entity
    {
        public int Id;
        public string EntityName;
    
        [JsonProperty(PropertyName = "Items")]
        private List<Entity> _items;
    
        //Sub entities
        [JsonIgnore]
        public IReadOnlyList<Entity> Items
        {
            get { return _items; }
        }
    }
    

    【讨论】:

    • 你测试了吗?它有效吗?我看到了这个错误 - A member with the name 'Items' already exists on 'TestConsole.Entity'. Use the JsonPropertyAttribute to specify another name.
    • 将 [JsonIgnore] 添加到另一个字段。
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-07-27
    相关资源
    最近更新 更多