Десериализация данных странной формы с использованием System.Text. Json - PullRequest
1 голос
/ 18 апреля 2020

Я конвертирую из Newtonsoft. Json в System.Text. Json, и я столкнулся с данными, которые выглядят так:

    ...
    "people": {
      "ID001": {
        "id": "ID001",
        "surame": "Smith",
        "given": "Joe"
      },
      "ID002": {
        "id": "ID002",
        "surame": "Brown",
        "given": "George"
      }
    },
    ...

Есть дополнительный, ненужный уровень в там "ID001", "ID002" и т. д. c.

Поскольку данные на самом деле находятся в месте, которое должно быть меткой, я застрял, пытаясь понять, как их отобразить, поскольку "метка" разные для каждой записи.

(я также отмечу, что я не могу контролировать источник данных; изменять его нельзя)

С Newtonsoft я бы прочитал весь «Люди» структура в объект Perople_Raw, когда при синтаксическом анализе с использованием Dynami c я бы сериализовал отдельный элемент, убрал бы значение "IDxxx" и затем повторно проанализировал результат.

dynamic peopleArray = this.OverallDataObject.People_Raw
foreach (dynamic peopleItem in peopleArray) {
  string serialized = JsonConvert.SerializeObject(playerBio_raw);
  int posOpenBrace = serialized.IndexOf('{');
  Person person = JsonConvert.DeserializeObject<Person>(serialized.Substring(posOpenBrace));
  this.OverallDataObject.People.Add(person);
}

System.Text. Json не поддерживает такой вид дурачества, однако, как можно указать отображение, чтобы оно получило массив объектов Person? Через какой-то промежуточный объект, который содержит внешний идентификатор плюс объект Person?

1 Ответ

2 голосов
/ 18 апреля 2020

System.Text. Json поддерживает десериализацию до Dictionary<string, TValue>, поэтому это будет работать с вашими данными:

public class Container
{
    public Dictionary<string, Person> People { get; set; }
}

public class Person
{
    public string Id { get; set; }

    public string Surame { get; set; }

    public string Given { get; set; }
}

Исходя из Newtonsoft. Json, также важно отметить, что System. Текст. Json чувствителен к регистру по умолчанию . Обязательно установите PropertyNameCaseInsensitive:

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
};
var deserialized = JsonSerializer.Deserialize<Container>(json, options);
Console.WriteLine(deserialized.People["ID001"].Given); // Joe

Пример скрипты: https://dotnetfiddle.net/ipVpdu

...