Десериализация json с динамическим именем свойства - PullRequest
0 голосов
/ 06 декабря 2018

Аналогичный вопрос был задан здесь Сериализация / десериализация динамического имени свойства с использованием JSON.NET .Я не могу заставить его работать в моей ситуации, как показано ниже:

У меня есть следующий JSON

{
    "notes": {
        "data": [{
                "book": {
                    "items": [{
                            "page": "page 1",
                            "comment": "Some notes"
                        },
                        {
                            "page": "page 1",
                            "comment": "Some notes"
                        }
                    ]
                }
            },
            {
                "journal": {
                    "items": [{
                            "page": "page 1",
                            "comment": "Some notes"
                        },
                        {
                            "page": "page 1",
                            "comment": "Some notes"
                        }
                    ]
                }
            },
            {
                "magazine": {
                    "items": [{
                            "page": "page 1",
                            "comment": "Some notes"
                        },
                        {
                            "page": "page 1",
                            "comment": "Some notes"
                        }
                    ]
                }
            }
        ]
    }
}

Созданы следующие классы для сериализации JSON:

public class TestParse
  {
    public Note Notes { get; set; }
  }
  public class Note
  {
    public IList<Data> Data { get; set; }
  }

  public class Data
  {
    public Source Source { get; set; }
  }

  [JsonConverter(typeof(MyConverter))]
  public class Source
  {
    public IList<Items> Items { get; set; }
  }

  public class Items
  {
    public string Page { get; set; }
    public string Comment { get; set; }
  }

  public class MyConverter : JsonConverter
  {
    public override bool CanConvert(Type objectType)
    {
      return objectType == typeof(Source);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
      var jo = JObject.Load(reader);

      var req = new Data
      {
        Source = jo.ToObject<Source>()
      };
      return req;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
      var req = (Source)value;
      var jo = new JObject(
          new JObject(req.Items));
      jo.WriteTo(writer);
    }
  }
}

Я до сих пор не могу десериализовать «Источник».Любой указатель приветствуется.

1 Ответ

0 голосов
/ 06 декабря 2018

В другом вопросе , на который вы ссылались, динамический ключ определялся значением другого свойства в том же объекте.Следовательно, был необходим конвертер.

В вашей ситуации у вас есть динамические клавиши, но они ни от чего не зависят.Вам действительно не нужен конвертер здесь;Вы можете просто использовать словарь для обработки динамических клавиш.

Измените эту строку в вашем Note классе:

public IList<Data> Data { get; set; }

на следующее:

public IList<IDictionary<string, Source>> Data { get; set; }

и удалите атрибут [JsonConverter] из вашего Source класса,Тогда он должен работать.
(Вы также можете удалить класс Data, так как он не нужен.)

Fiddle: https://dotnetfiddle.net/80lIRI

...