2015-03-10 3 views
4

Я не смог найти точный ответ, за который я так думаю, что у меня будет трещина в вопросе вопроса.vb.NET Deserialise Список JSON в объект

В настоящее время я пытаюсь десериализовать строку JSON в объект в vb.NET с помощью Json.NET; Я сделал несколько ранее, настроив соответствующие классы, а затем десериализуя строку на объект с помощью родительского класса, и они отлично работали, но этот, похоже, не совсем прав.

Пример строки Я пытаюсь сломать следующим образом:

[ 
    { 
     "value": 12345, 
     "text": "Example Unique Text" 
    }, 
    { 
     "InnerList": [ 
      { 
       "value": 4746, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4747, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4748, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4749, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4750, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4751, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4752, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4753, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4754, 
       "text": "A duplicated entry of text" 
      }, 
      { 
       "value": 4755, 
       "text": "A duplicated entry of text" 
      } 
     ], 
     "duplicated": "Yes" 
    }, 
    { 
     "value": 15298, 
     "text": "Another Example Unique Text" 
    }, 
    { 
     "value": 959, 
     "text": "Yet more uniqueness" 
    }, 
    { 
     "value": 801, 
     "text": "A final little bit of unique text" 
    } 
] 

Я попытался прохождения этого через ряд внешних инструментов, и все они возвращаются с теми же определениями класса, однако они, похоже, не работали. Так на основе моего понимания JSON я соединял следующее:

Public Class ItemDetails 

     Public Value As Integer 
     Public Text As String 

End Class 

Public Class ItemArray 

     Public DetailList As List(Of ItemDetails) 
     Public Duplicated As String 

End Class 

Public Class GeneralArray 

     Public GeneralList As List(Of ItemArray) 

End Class 

GeneralArray является родительским классом и то, что используется для разбора JSON.

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

Dim JSONString As String 

JSONString = "<JSONStringDetails>" 

Dim JSONObj = JsonConvert.DeserializeObject(Of JSONStringCollection.GeneralArray)(JSONString) 

К сожалению, при прохождении этого через следующее возвращается и рутинные перерывы:

необработанное исключение типа «Newtonsoft.Json.JsonSerializationException» произошло в Newtonsoft.Json.dll

Дополнительная информация: не может десериализации текущий массив JSON (например, [1,2,3]) в тип 'ShadOS.JSONStringCollection + GeneralArray', потому что для типа требуется объект JSON (например, {"name": "value"}) для десериализации .

Что мне не хватает с этим?

+0

Не то, что знакомо с JSON, но похоже, что есть проблема с JSON, а не с десериализатором или вашим объектом. – Tim

ответ

3

Ваш JSON строка представляет собой массив объектов (вы можете увидеть это, потому что все завернуты между [ и ]).

В сообщении об ошибке говорится: «Вы пытались десериализовать массив объектов в один объект». Ваш целевой тип GeneralArray не ведет себя как массив (например, он не наследуется от типа массива/коллекции и не реализует интерфейс коллекции).

Другая проблема заключается в том, что массив JSON «смешанный» - он содержит некоторые объекты, которые выглядят как ItemDetails и другие объекты, которые выглядят как ItemArray. В статическом языке, таком как VB.NET, это сложнее десериализовать в одну коллекцию различных типов.

Одним из возможных решений является объединить целевые классы ItemDetails и ItemArray в один класс, вдоль линий

Public Class CombinedItem 
    'properties from ItemDetails 
    Public Value As Integer 
    Public Text As String 

    'properties from ItemArray 
    Public InnerList As List(Of CombinedItem) 
    Public Duplicated As String 

End Class 

Учитывая этот класс, ваш десериализации может выглядеть следующим образом:

Dim JSONObj = JsonConvert.DeserializeObject(Of List(Of CombinedItem))(JSONString) 

Здесь вы указываете Newtonsoft, что целевой тип - это List(Of CombinedItem) - массив/коллекция, подобная цели.

JSONObj Теперь это коллекция CombinedItem - некоторые из них будут иметь свойство Value/Text, другие будут иметь свойство InnerList/Duplicated.

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