Как преобразовать массив Json в список объектов в С#

У меня есть строка Json, как показано ниже

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

Я хочу преобразовать строку Json в классы ниже

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }

class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

Мой код десериализации

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

Но после сериализации получаю нулевые значения. Как я могу это решить?

Ответ 1

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

Чтобы соответствовать JSON, который вы опубликовали в своем вопросе, ваши классы должны быть определены следующим образом. Заметьте, что внесли следующие изменения:

  • Я добавил класс Wrapper, соответствующий внешнему объекту в вашем JSON.
  • Я изменил свойство Values класса ValueSet с List<Value> на Dictionary<string, Value>, так как свойство Values в вашем JSON содержит объект, а не массив.
  • Я добавил несколько дополнительных атрибутов [JsonProperty] для соответствия именам свойств в ваших объектах JSON.

Определения классов:

class Wrapper
{
    [JsonProperty("JsonValues")]
    public ValueSet ValueSet { get; set; }
}

class ValueSet
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("values")]
    public Dictionary<string, Value> Values { get; set; }
}

class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("diaplayName")]
    public string DisplayName { get; set; }
}

Вам нужно десериализовать класс Wrapper, а не класс ValueSet. Затем вы можете получить ValueSet из Wrapper.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

Вот рабочая программа для демонстрации:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"
        {
            ""JsonValues"": {
                ""id"": ""MyID"",
                ""values"": {
                    ""value1"": {
                        ""id"": ""100"",
                        ""diaplayName"": ""MyValue1""
                    },
                    ""value2"": {
                        ""id"": ""200"",
                        ""diaplayName"": ""MyValue2""
                    }
                }
            }
        }";

        var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

        Console.WriteLine("id: " + valueSet.Id);
        foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
        {
            Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
            Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
        }
    }
}

И вот вывод:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2

Ответ 2

http://json2csharp.com/

Я нашел ссылку выше невероятно полезной, поскольку она исправила мои классы С#, вызвав их из JSON, который был фактически возвращен.

Затем я позвонил:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

и все работало, как ожидалось.

Ответ 3

Ваша структура данных и ваш JSON не совпадают.

Ваш JSON:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

Но структура данных, которую вы пытаетесь выполнить сериализацией, такова:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

Вы пропустите шаг: ваш JSON - это класс, у которого есть одно свойство с именем JsonValues, которое имеет объект вашей структуры данных ValueSet как значение.

Также внутри вашего класса ваш JSON:

"values": { ... }

Ваша структура данных такова:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

Обратите внимание, что { .. } в JSON определяет объект, где as [ .. ] определяет массив. Поэтому, согласно вашему JSON, у вас нет кучи значений, но у вас есть one объект значений со свойствами value1 и value2 типа Value.

Поскольку десериализатор ожидает массив, но вместо него получает объект, он выполняет наименее неразрушающую (исключение) вещь, которую он может сделать: пропустите значение. Свойство values остается с его значением по умолчанию: null.

Если вы можете: Отрегулируйте свой JSON. Следующее будет соответствовать вашей структуре данных и, скорее всего, вы действительно хотите:

{
    "id": "MyID",

     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}

Ответ 4

у вас есть непревзойденная строка jSon, если вы хотите конвертировать в список, попробуйте это

{
    "id": "MyID",

     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}

Ответ 5

Вы проверили, что эта строка работает отлично, и ваша строка имеет значение в ней?

string jsonString = sr.ReadToEnd();

если да, попробуйте этот код для последней строки:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

или если у вас есть массив json, вы можете использовать следующий список:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

удача

Ответ 6

Это тоже возможно:

   using System.Web.Helpers;
   var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);