Десериализовать событие API данных Mixpanel в формате JSON C#

#c# #json.net #mixpanel

#c# #json.net #mixpanel

Вопрос:

Я пытаюсь десериализовать некоторый json из API данных mixpanel с помощью Newtonsoft Json, я создал класс, но получаю ошибки. Проблема заключается в том, что свойства A и B в объекте ‘values’ не являются фиксированными именами. Следовательно, я думал, что использование Dictionary<string, NameValueCollection> сработает. Любая помощь в этом была бы отличной

JSON:

 {
  "legend_size": 1,
  "data": {
    "series": [
      "2014-06-30"
    ],
    "values": {
      "A": {
        "2014-06-30": 1082,
        "2014-06-23": 4249
      },
      "B": {
        "2014-06-30": 1082,
        "2014-06-23": 4249
      }
    }
  }
}
  

Результаты.cs

 public class Result
{
    [JsonProperty("data")]
    public Data Data { get; set; }

    [JsonProperty("legend_size")]
    public int LegendSize { get; set; }
}

public class Data
{
    [JsonProperty("series")]
    public IEnumerable<DateTime> Series { get; set; }

    [JsonConverter(typeof(MixEventValuesConverter))]
    [JsonProperty("values")]
    public IDictionary<string, NameValueCollection> Values { get; set; }
}
  

Я создал конвертер (впервые в истории, я действительно не знаю, что я с ним делаю!) и попытался вернуть только пустое значение на данный момент, но я получаю сообщение об ошибке «Дополнительный текст, найденный в строке JSON после завершения десериализации объекта»..

MixEventValuesConverter.cs

  public class MixEventValuesConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var col = new NameValueCollection();
            col.Add("testtest", "vallll");

            var dic = new Dictionary<string, NameValueCollection>();
            dic.Add("testt", col);

            return dic;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(MixEventResult);
        }
    }
  

Ответ №1:

Здесь вам не нужен конвертер; просто используйте вложенный словарь, подобный этому:

 public class Data
{
    [JsonProperty("series")]
    public IEnumerable<DateTime> Series { get; set; }

    [JsonProperty("values")]
    public IDictionary<string, IDictionary<DateTime, int>> Values { get; set; }
}
  

Комментарии:

1. Сработало в первый раз, спасибо нагрузкам, дам, он работал над этим целую вечность!

2. Нет проблем; рад, что смог помочь.