2013-12-03 4 views
2

Я пытаюсь десериализовать специальный массив для объекта в Visual Basic. Следующие данные json предоставляются службой webservice, которую я использую; интересная мне часть - это свойство «данных»; в основном это массив строк массивов, каждый из массива, представляющего собой объект:Как десериализировать массив содержащихся строк и объектов в JSON.NET

{"timestamp":1385984969075, 
"data": 
[ 
    [1590,null,null,null,0], 
    [1020,"data a",null,null,0], 
    [1025,"data b",null,null,0], 
    ... 
    [2756,"data c",null, 
    [ 
     {"id":2,"name":"Tom","mail":"[email protected]","f_id":6,"md":1}, 
     {"id":3,"name":"Carl","mail":"[email protected]","f_id":6,"md":1} 
    ] 
    ,3], 
    [1277,"data d",null,null,0], 
    ... 
    ]} 

В этом примере элемент данных 4 из каждого массива может быть либо пустым или содержать массив объектов.

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

(я пишу в Visual Basic.NET, но C# примеры приветствуются.)

Может кто-то помочь, пожалуйста?

+0

Я deserialized к списку strin массив. Этот подход работал сначала, потому что изначально у меня не было ответов с массив объектов в нем. Я использовал Dim ответ Как Новый contactGetAnswerObject ответ = CTYPE (JsonConvert.DeserializeObject (conn.serverResponse, GetType (contactGetAnswerObject)), contactGetAnswerObject) Открытый класс метки времени contactGetAnswerObject публичной собственности As Long данные общественной собственности в качестве списка (string()) End Class, – rootusertom

+0

Вы сами создали этот веб-сервис, который производит этот JSON? почему вы не можете просто создать класс объектов объекта, из которого вы можете создать список/массив объекта? – user1352057

+0

Нет, я сам не писал веб-сервис. Вывод веб-службы является переменным; вам необходимо отправить список необходимых свойств в ваш запрос на обслуживание. Затем вы получаете массив, содержащий массив требуемых свойств для каждого элемента, соответствующего запросу. – rootusertom

ответ

0

Обновлено:

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

Опять надеюсь, это поможет вам:

var list = new People 
     { 
      PersonList = new object[] 
      { 
       new object[] 
      { 
       "Test1", "Test2", "Test3", null, new object[]{new Person{Name="John", Age=21}}, 1 
      }, 
       new object[] 
      { 
       "Test4", "Test5", "Test6", null, null, 2 
      }, 
      new object[] 
      { 
       "Test17", "Test8", "Test9", null, new object[]{new Person{Name="Sara", Age=31}}, 3 
      }, 
       new object[] 
      { 
       "Test10", "Test11", "Test12", null, null, 4 
      }, 
      new object[] 
      { 
       "Test13", "Test14", "Test15", null, new object[]{new Person{Name="John", Age=31}}, 5 
      } 
      } 
     }; 

     string output = JsonConvert.SerializeObject(list); 

     var objList = JsonConvert.DeserializeObject<People>(output); 

     objectList = objList.PersonList; 

     foreach(JArray objectItem in objectList) 
     { 

      var stringOne = (string)objectItem[0]; 
      var stringTwo = (string)objectItem[1]; 
      var stringthree = (string)objectItem[2]; 
      var nullObj = objectItem[3]; 

      foreach(var individual in objectItem[4]) 
      { 
       JObject obj = (JObject)JToken.FromObject(individual); 
       var person = obj.ToObject<Person>(); 

       string name = person.Name; 
       int age = person.Age; 
      } 
      var num = (int)objectItem[5]; 
     } 

JSON:

{ 
"PersonList": [ 
    [ 
     "Test1", 
     "Test2", 
     "Test3", 
     null, 
     [ 
      { 
       "Name": "John", 
       "Age": 21 
      }, 
      { 
       "Name": "Pete", 
       "Age": 44 
      } 
     ], 
     1 
    ], 
    [ 
     "Test4", 
     "Test5", 
     "Test6", 
     null, 
     null, 
     2 
    ], 
    [ 
     "Test17", 
     "Test8", 
     "Test9", 
     null, 
     [ 
      { 
       "Name": "Sara", 
       "Age": 31 
      } 
     ], 
     3 
    ], 
    [ 
     "Test10", 
     "Test11", 
     "Test12", 
     null, 
     null, 
     4 
    ], 
    [ 
     "Test13", 
     "Test14", 
     "Test15", 
     null, 
     [ 
      { 
       "Name": "John", 
       "Age": 31 
      } 
     ], 
     5 
    ] 
] 

}

Person Класс:

public class Person 
{ 
    public string Name { set; get; } 

    public int Age { set; get; } 
} 

PeopleList класс:

public class People 
{ 
    public object[] PersonList { set; get; } 
} 
+0

Большое спасибо за ваши усилия! Увы, это мне не помогает. Ваш код сериализует и затем десериализует массив объектов. Но в моем примере нет чистого массива объектов. Это скорее массив, содержащий строки и один объект (который также может быть нулевым). – rootusertom

+0

Я бы написал CustomCreationConverter, но я не полностью отключаю механизм. Есть ли хороший пример или учебник, о котором вы знаете? Похоже, что я «подключился» к функции десериализации определенного типа (в этом случае строковый массив) и написал для меня свой собственный код? – rootusertom

+0

@rootusertom См. Мой обновленный ответ еще раз. – user1352057

0

Еще раз спасибо за ваши усилия! Я перевел ваш пример кода на VB.NET (обратите внимание, что первый блок с определением объекта «list» должен быть одной строкой в ​​Visual Studio, я только отформатировал его для лучшего обзора):

Dim list = New People With {.PersonList = 
     New Object() { 
      New Object() {"Test1", "Test2", "Test3", Nothing, New Object() 
        {New Person With {.Name = "John", .Age = 21}}, 
      1}, 
      New Object() {"Test4", "Test5", "Test6", Nothing, Nothing, 2}, 
      New Object() {"Test17", "Test8", "Test9", Nothing, New Object() 
        {New Person With {.Name = "Sara", .Age = 31}}, 
      3}, 
      New Object() {"Test10", "Test11", "Test12", Nothing, Nothing, 4}, 
      New Object() {"Test13", "Test14", "Test15", Nothing, New Object() 
        {New Person With {.Name = "John", .Age = 31}}, 
      5} 
     } 
    } 

    Dim output As String = JsonConvert.SerializeObject(list) 
    MessageBox.Show(output) 

    Dim objList = JsonConvert.DeserializeObject(Of People)(output) 

    Dim objectList As Object() = objList.PersonList 

    For Each objectItem As JArray In objectList 
     Dim stringOne As String = CStr(objectItem(0)) 
     Dim stringTwo As String = CStr(objectItem(1)) 
     Dim stringThree As String = CStr(objectItem(2)) 
     Dim nullObj As Object = objectItem(3) 
     For Each individual As Object In objectItem(4) 
      Dim obj As JObject = DirectCast(JToken.FromObject(individual), JObject) 
      Dim person As Person = obj.ToObject(Of Person)() 
      Dim name As String = person.Name 
      Dim age As Integer = person.Age 
     Next 
     Dim num As Integer = CInt(objectItem(5)) 

    Next 

В основном этот подход является тем, что я пытаюсь сделать прямо сейчас. Я просто подумал, что должен быть более элегантный способ (без обид!) С использованием JSON.NET. На мой взгляд, большой недостаток - это список типов приведения в цикле for-each; мой объект данных имеет около 110 свойств, причем два из них имеют под-объекты с 10 свойствами. Также в моем проекте есть 3 или 4 объекта данных с наименьшим размером.

Итак, моя идея - написать функцию, которая выводит тип свойства из целевого объекта, а затем делать типы приведения более или менее автоматически. У меня есть список имен свойств для вызова веб-службы, поэтому этот список можно использовать для поиска имени свойства, соответствующего элементу ответа.

В любом случае, я посмотрю на jArray и jObject, поскольку я пока не использовал их.

+0

, если мой код заставил вас на правильном пути и ответил на вопрос, не стесняйтесь отметить мой ответ как правильный. Рад, что это может помочь. – user1352057

+0

argh! совершенно хороший C# пост получил VB-ized .. :) – code4life

Смежные вопросы