2016-08-10 3 views
0

Я пытаюсь десериализовать следующие объекты JSON для C#. Тем не менее, я пытаюсь достичь этого, не создавая классы для объектов "1". Это всего лишь небольшой фрагмент JSON, который я буду обрабатывать, а некоторые объекты JSON будут содержать до 40 дочерних объектов, то есть мне придется дублировать много кода.Deserializing complex JSON to C# objects

Есть ли способ десериализовать этот стиль JSON на объекты C# без создания классов для 1, 2 и т. Д.?

{ 
"WANConnectionDevice": { 
    "1": { 
     "WANPPPConnection": { 
      "1": { 
       "ExternalIPAddress": { 
        "_value": "0.0.0.0", 
        "_timestamp": "2016-08-04T08:51:37.813Z", 
        "_type": "xsd:string", 
        "_writable": false 
        }, 
       "Password": { 
        "_writable": true, 
        "_timestamp": "2016-08-02T10:40:35.134Z", 
        "_value": "test6", 
        "_type": "xsd:string" 
        }, 
       "Username": { 
        "_writable": true, 
        "_timestamp": "2016-08-02T10:40:35.134Z", 
        "_value": "[email protected]", 
        "_type": "xsd:string" 
        }, 
       "MACAddress": { 
        "_writable": false, 
        "_timestamp": "2016-08-02T16:48:15.188Z", 
        "_value": "", 
        "_type": "xsd:string" 
       } 
      } 
     } 
    }, 
    "2": { 
     "WANIPConnection": { 
      "1": { 
       "ExternalIPAddress": { 
        "_writable": true, 
        "_timestamp": "2016-08-02T16:48:15.188Z", 
        "_value": "", 
        "_type": "xsd:string" 
        }, 
       "MACAddress": { 
        "_writable": false, 
        "_timestamp": "2016-08-02T16:48:15.188Z", 
        "_value": "", 
        "_type": "xsd:string" 
        } 
       } 
      } 
     } 
    } 
} 

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

public class _1 
{ 
    public ExternalIPAddress ExternalIPAddress { get; set; } 
    public Password Password { get; set; } 
    public Username Username { get; set; } 
    public MACAddress MACAddress { get; set; } 
} 

public class WANPPPConnection 
{ 
    public _1 _1 { get; set; } 
} 

public class _1 
{ 
    public WANPPPConnection WANPPPConnection { get; set; } 
} 

public class WANIPConnection 
{ 
    public _1 { get; set; } 
} 

public class _2 
{ 
    public WANIPConnection WANIPConnection { get; set; } 
} 
+0

ли десериализации с классами работает? Или у вас проблемы с этим? Вы можете назвать классы по-разному (например, 'Device_1',' Device_2', 'Connection_1' и т. Д.) И использовать [' JsonPropertyAttribute'] (http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm) для сопоставления свойства json object '1',' 2' и т. д. Почему вы думаете, что это «не практичный или хороший дизайн» *? – Sinatr

+0

@ Sinatr Проблема с тем, что это не практичный или хороший дизайн, заключается в том, что используется метод 'Device_1, Device_2 и т. Д. '. будет означать повторение одного и того же кода до 40 раз для одного из объектов JSON, которые мы получаем. –

ответ

1

Вы можете преобразовать данные json в динамический объект.

с Json.NET

dynamic entity = JsonConvert.DeserializeObject(jsonstring); 

затем получить доступ, как этот

dynamic entity1 = entity.WANConnectionDevice.1;