Как я могу десериализовать объект json в сложный объект? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь десериализовать объект JSON в объект с некоторым атрибутом «объект», который может каждый раз отличаться.У меня есть функция сериализатора / десериализатора, которая отлично работает при использовании простых типов переменных или определенных.

Я пытался привести объект к нужному классу, пытался получить объект как динамический и т. Д. Однако я всегдаполучить исключение: «Ссылка на объект не установлена ​​...»

Функция десериализации:

        public static T deserializeJSON<T>(string json)
        {
            T obj = Activator.CreateInstance<T>();
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType($
                obj = (T)serializer.ReadObject(ms);
            }
            return obj;
        }

Пример объекта:

 [DataContract]
    class Client
    {
        [DataMember] private string name;
        [DataMember] private string address;
        [DataMember] private string bio;
        [DataMember] private object specific; //WHERE SPECIFIC MAY BE ANY OTHER OBJECT THAT I CAST AFTER DESERIALIZATION
    }

Пример объекта2:

 [DataContract]
    class Server
    {
        [DataMember] private string name;
        [DataMember] private int value;
    }

Специфическим атрибутом может быть любой другой объект.Представьте, что «конкретный» атрибут является объектом типа «Сервер»;Функция десериализации хорошо загружает все атрибуты, а не специфические, которые загружаются как объект, но не могут преобразовать их в сервер.

PD: В момент десериализации я знаю, какой тип класса является «конкретным» атрибутом.

Спасибо!

1 Ответ

0 голосов
/ 21 мая 2019

используя последнюю версию json.net, вы можете использовать

dynamic data = Json.Decode(json);

или

dynamic data = JObject.Parse(json);

и получать доступ к данным с помощью следующего кода:

data.Date; 
data.Items.Count; 
data.Items[0].Name; 
data.Items[0].Price; 
data.Items[1].Name; 
...