Десериализовать JSON C #

1

У меня проблема десериализации json-объекта, потому что она не состоит из массива.

Образец строки json:

 {
  "Data": {
    "A1": {
      "name": "",
      "code": "",      
      "type": ""
    },
    "A2": {
     "name": "",
      "code": "",      
      "type": ""
    },
    "A3": {
      "name": "",
      "code": "",      
      "type": ""
    }
  }
}

И вот мой код, строка json будет считана из файла и не может быть изменена.

var json = "{\"Data\":{\"A1\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"},\"A2\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"},\"A3\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"}}}";
var jobject = JsonConvert.DeserializeObject<DataContainer>(json);


public class Data
{
    public string name { get; set; }
    public string code { get; set; }            
    public string type { get; set; }
}

public class DataContainer
{
    public List<Data> Data { get; set; }
}

Единственный способ, которым я это сделал, - это изменить json, чтобы использовать массив, подобный приведенному ниже примеру, но я бы хотел решить это без необходимости изменять формат json файла.

{
  "Data": [
    {
      "name": "",
      "code": "",      
      "type": ""
    },
    {
     "name": "",
      "code": "",      
      "type": ""
    },
    {
      "name": "",
      "code": "",      
      "type": ""
    }
  ]
}

благодаря

Теги:
json.net

3 ответа

1
Лучший ответ

ваш json содержит объект Data, который содержит три разных объекта: A1, A2, A3.

Поэтому я думаю, вам нужно реализовать три разных класса, а контейнер

public class A1
{
    public string name { get; set; }
    public string code { get; set; }
    public string type { get; set; }
}

public class A2
{
    public string name { get; set; }
    public string code { get; set; }
    public string type { get; set; }
}

public class A3
{
    public string name { get; set; }
    public string code { get; set; }
    public string type { get; set; }
}

public class Data
{
    public A1 A1 { get; set; }
    public A2 A2 { get; set; }
    public A3 A3 { get; set; }
}
  • 0
    Боялся этого, будут сотни таких объектов, имеющих одинаковую структуру, надеялся сделать это без создания класса для каждого из них.
  • 0
    возможно надо поменять формат json
Показать ещё 3 комментария
0

Если вы хотите использовать исходный формат данных JSON, измените определение класса DataContainer на использование Dictionary<string, Data> вместо List<Data>:

public class DataContainer
{
    public Dictionary<string, Data> Data { get; set; }
}
0

Я создал 2 класса и вручную десериализую объект json следующим образом:

class Program
{
    static void Main(string[] args)
    {
        var json = "{\"Data\":{\"A1\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"},\"A2\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"},\"A3\":{\"name\":\"\",\"code\":\"\",\"type\":\"\"}}}";
        var data = (JsonConvert.DeserializeObject(json) as Newtonsoft.Json.Linq.JObject).First.First;

        List<DataItem> list = new List<DataItem>();
        foreach (var item in data.ToList())
        {
            list.Add(new DataItem()
            {
                Name = ((Newtonsoft.Json.Linq.JProperty)(item)).Name,
                A = JsonConvert.DeserializeObject<A>(item.First.ToString())
            });
        }
    }

    class DataItem
    {
        public string Name { get; set; } //A1, A2, A3 ....
        public A A { get; set; }
    }

    class A
    {
        public string name { get; set; }
        public string code { get; set; }
        public string type { get; set; }
    }
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню