Member 12586110 Ответов: 2

В C# как десериализовать вложенные данные json


Привет, у меня есть строка json, которую я пытаюсь разобрать и присвоить значения переменной. Я использую System.Web.Script.Библиотека сериализации JavaScriptSerializer.

var data = "{
    "data1": {
"EntityList": "Attribute",
"KeyName": "AkeyName",
"Value": "Avalue"
    },
    "data2": {
        "Id": "jsdksjkjdiejkwp12193jdmsldm",
        "Status": "OK"
    }
}"; //variable with json string
JavaScriptSerializer jss = new JavaScriptSerializer();
dynamic drecord = jss.Deserialize<dynamic>(data);


Что я уже пробовал:

Когда я пытаюсь разобрать эту строку json в переменную для значения EntityList и KeyName, как показано ниже, я сталкиваюсь со всевозможными ошибками.

var EntityList = drecord.data1.EntityList


Не могли бы вы помочь мне записать значение EntityList и KeyName в переменную.

Спасибо.

2 Ответов

Рейтинг:
18

Richard Deeming

Похоже JavaScriptSerializer не поддерживает десериализацию в dynamic объект. Если вы посмотрите на тип вашего drecord переменная, вы увидите, что это Dictionary<string, object>, который не поддерживает динамический доступ.

Вам нужно будет использовать индексаторы для доступа к свойствам:

dynamic drecord = jss.Deserialize<dynamic>(data);
string entityList = drecord["data1"]["EntityList"];
string keyName = drecord["data1"]["KeyName"];


Member 12586110

Спасибо, Ричард Диминг.

Рейтинг:
0

Matthew Dennis

Согласно документации MS для этого метода, вы должны использовать его.

Цитата:
Класс JavaScriptSerializer
Определение
Пространство имен:
System.Web.Script.Сериализация
Собрание:
System.Web.Extensions.dll
Для .NET Framework 4.7.2 и более поздних версий используйте API-интерфейсы в System.Text.Пространство имен Json для сериализации и десериализации. Для более ранних версий .NET Framework используйте файл Newtonsoft.Json. Этот тип был предназначен для обеспечения функциональности сериализации и десериализации для приложений с поддержкой AJAX.


Итак, с помощью Newtonsoft.Json (он же Json.net)
using System;
using Newtonsoft.Json;

namespace Answer
{
    class Program
    {
        public class DataType1
        {
            public string EntityList { get; set; }
            public string KeyName { get; set; }
            public string Value { get; set; }
        }

        public class DataType2
        {
            public string Id { get; set; }
            public string Status { get; set; }
        }

        public class MyData
        {
            public DataType1 data1 { get; set; }
            public DataType2 data2 { get; set; }
        }

        static void Main(string[] args)
        {
            var data = @"{
                ""data1"": {
                    ""EntityList"": ""Attribute"",
                    ""KeyName"": ""AkeyName"",
                    ""Value"": ""Avalue""
                        },
                ""data2"": {
                    ""Id"": ""jsdksjkjdiejkwp12193jdmsldm"",
                    ""Status"": ""OK""
                }
            }"; //variable with json string

            var myData = JsonConvert.DeserializeObject<MyData>(data);
            

        Console.WriteLine($"EntityList:{myData.data1.EntityList}, KeyName:{myData.data1.KeyName}");
        }
    }
}