Как десериализовать строку JSON, содержащую несколько объектов различного типа - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующая json строка: "{"\"itemList\":[{\"id\":1,\"name\":\"Item 1 Name\"},{\"id\":2,\"name\":\"Item 2 Name\"}],"listInfo":{"info1":1,"info2":"bla"}}"

У меня есть следующие классы:

class ItemClass
{
    public int Id;
    public string Name;
}

class ListInfo
{
    public int Info1 { get; set; }
    public string Info2 { get; set; }
}

Как я могу десериализовать мою строку json в два разных объекта он содержит, ItemList и ListInfo? ItemList следует десериализовать в List<ItemClass>. Я много раз использовал десериализацию с использованием JsonConvert, но со строкой json, которая представляет отдельный объект.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2020

Ваш json формат неверный. измените "{"\"itemList\":[{\"id\":1,\"name\":\"Item 1 Name\"},{\"id\":2,\"name\":\"Item 2 Name\"}],"listInfo":{"info1":1,"info2":"bla"}}"

на

"{\"itemList\":[{\"id\":1,\"name\":\"Item 1 Name\"},{\"id\":2,\"name\":\"Item 2 Name\"}],\"listInfo\":{\"info1\":1,\"info2\":\"bla\"}}"

, затем создайте такой класс

public class BaseClass
{
    public List<ItemClass> ItemList { get; set; }
    public ListInfo ListInfo { get; set; }
}

и используйте JsonConvert.DeserializeObject для десериализации json в ваш класс

string json = "{\"itemList\":[{\"id\":1,\"name\":\"Item 1 Name\"},{\"id\":2,\"name\":\"Item 2 Name\"}],\"listInfo\":{\"info1\":1,\"info2\":\"bla\"}}";
var data =  JsonConvert.DeserializeObject<BaseClass>(json);
0 голосов
/ 24 февраля 2020

генерировать c# классов из json: http://json2csharp.com/

var st = "{\"itemList\":[{\"id\":1,\"name\":\"Item 1 Name\"},{\"id\":2,\"name\":\"Item 2 Name\"}],\"listInfo\":{\"info1\":1,\"info2\":\"bla\"}}";
  var model = JsonConvert.DeserializeObject<RootObject>(st);

Модели:

  public class ItemList
  {
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
  }

  public class ListInfo
  {
    [JsonProperty("info1")]
    public int Info1 { get; set; }
    [JsonProperty("info2")]
    public string Info2 { get; set; }
  }

  public class RootObject
  {
    [JsonProperty("itemList")]
    public List<ItemList> ItemList { get; set; }
    [JsonProperty("listInfo")]
    public ListInfo ListInfo { get; set; }
  }
0 голосов
/ 24 февраля 2020

Сначала создайте временный класс для чтения Json,

// New temporary class
    public class TempClass
    {
        public List<ItemClass> ItemList { get; set; }
        public ListInfo ListInfo { get; set; }
    }

    public class ItemClass
    {
        public int Id;
        public string Name;
    }

    public class ListInfo
    {
        public int Info1 { get; set; }
        public string Info2 { get; set; }
    }

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

List<ItemClass> ItemsList = ((TempClass)JsonConvert.DeserializeObject<TempClass>(strJsom, new JsonSerializerSettings())).ItemList;
ListInfo ListInfo = ((TempClass)JsonConvert.DeserializeObject<TempClass>(strJsom, new JsonSerializerSettings())).ListInfo;

Теперь вы можете пройти через ItemsList, чтобы прочитать каждый ItemClass из Json.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...