Десерилиазация JSON с изменяющимися именами полей c#

Не могу понять как десерилиазовать json ответ от сервера, в котором возращается массив объектов в каждом из которых поле имеет разное имя.

{
   "status":1,
   "msg":"ok",
   "data":[
      {
         "2020-08-21":4
      },
      {
         "2020-08-22":1
      },
      {
         "2020-08-24":1
      }
   ]
}

Подскажите, пожалуйста, как можно реализовать десерелизацию. Использую библиотеку Newtonsoft.Json


Ответы (1 шт):

Автор решения: motpfofs

Попробуйте воспользоваться этим кодом:

public static void Main()
{
    var jsonString = @"{""status"":1,""msg"":""ok"",""data"":[{""2020-08-21"":4},{""2020-08-22"":1},{""2020-08-24"":1}]}";
    var deserializedResult = JsonConvert.DeserializeObject<JsonObject>(jsonString);
}
public class JsonObject
{
    public int Status { get; set; }

    public string Msg { get; set; }

    [JsonConverter(typeof(MyDateTimeConverter))]
    public MyDateTime[] Data { get; set; }
}
public class MyDateTime
{
    public DateTime Date { get; set; }

    public int Value { get; set; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var result = new List<MyDateTime>();

    if (reader.TokenType == JsonToken.StartObject)
    {
        var instance = serializer.Deserialize<JObject>(reader);

        foreach (JProperty property in instance.Properties())
        {
            result.Add(new MyDateTime
            {
                Value = property.Value.ToObject<int>(),
                Date = DateTime.Parse(property.Name)
            });
        }
    }
    else if (reader.TokenType == JsonToken.StartArray)
    {
        var myDateTimes = serializer.Deserialize<JArray>(reader);

        foreach (var myDateTime in myDateTimes)
        {
            foreach (JProperty property in ((JObject)myDateTime).Properties())
            {
                result.Add(new MyDateTime
                {
                    Value = property.Value.ToObject<int>(),
                    Date = DateTime.Parse(property.Name)
                });
            }
        }
    }

    return result.ToArray();
}

результат

→ Ссылка