c# system.text.json 将 "different" 对象反序列化为一个 class 的数组

c# system.text.json deserialize "different" object to an array of one class

我有一个 json 有这样的对象

"SeasonalInfoBySeasonID": {  
"aa8e0d2d-d29d-4c03-84f0-b0bda96a9fe1": {
                "ID": "aa8e0d2d-d29d-4c03-84f0-b0bda96a9fe1",
                "A": "1",
                "B": 5,
            },
"6f95fb92-5eb2-4fe4-ae01-dc54d810c8a5": {
                "ID": "6f95fb92-5eb2-4fe4-ae01-dc54d810c8a5",
                "A": "1",
                "B": 5,
            }, .....
}

SeasonalInfoBySeasonID 的对象显然都是相同的数据结构,但不幸的是,它们甚至没有列在数组中,我没有在 seasoninfobyseasonid 模型中一一列出它们,而是这样做的:

public class SeasonalInfoBySeasonID
    {
        private IDictionary<string, object> _additionalProperties = new Dictionary<string, object>();

        [JsonExtensionData]
        public IDictionary<string, object> AdditionalProperties
        {
            get { return _additionalProperties; }
            set { _additionalProperties = value; }
        }
    }

效果很好,但我想知道是否可以将具有多个“相同类型”对象的对象直接反序列化为数组?

您根本不需要 class。

您可以像这样在根对象上声明 属性

public Dictionary <string, YourType> SeasonalInfoBySeasonID {get;set;} = new Dictionary <string, YourType>();

那么每个键都是aa8e0d2d-d29d-4c03-84f0-b0bda96a9fe1等,对象就是内部类型

您可以将数据转换为列表

    using Newtonsoft.Json;

    var jsonObject = JObject.Parse(json);

    List<Item> list = ((JObject)jsonObject["SeasonalInfoBySeasonID"]).Properties()
                      .Select(p => p.Value.ToObject<Item>()).ToList();

public class Item
{
    public string ID { get; set; }
    public string A { get; set; }
    public int B { get; set; }
}

结果

[
  {
    "ID": "aa8e0d2d-d29d-4c03-84f0-b0bda96a9fe1",
    "A": "1",
    "B": 5
  },
  {
    "ID": "6f95fb92-5eb2-4fe4-ae01-dc54d810c8a5",
    "A": "1",
    "B": 5
  }
]

或者你可以使用字典

Dictionary<string,Item> SeasonalInfoBySeasonID = 
Object.Parse(json)["SeasonalInfoBySeasonID"]
.ToObject<Dictionary<string, Item>>();