#json #vb.net #json.net #.net-3.5
#json #vb.net #json.net #.net-3.5
Вопрос:
На самом деле я обрабатываю некоторые данные JSON, полученные из некоторого API в старом VB.NET проект в рамках Фреймворка 3.5
Я застрял в обработке следующего ответа:
{
"data": {
"89359": {
"name": "A",
//...
},
"89360": {
"name": "B",
//...
}
}
}
Каждый элемент в data является динамическим, но API не устанавливает данные в виде массива, я пытался получить данные из каждого элемента, как я еще делал для массивов JSON, подобных этому:
Dim options As JObject = JObject.Parse(json)
For Each opt As JObject In options("data")
MsgBox(opt("name"))
Next
Но в данном случае это не работает, поскольку, как я уже сказал, данные не являются массивом…
Итак, как можно обрабатывать данные из этого JSON, поскольку 89359 и 89360 являются динамическими?
Ответ №1:
Ваша проблема в том, что options("data")
объявлено, что оно имеет тип JToken
, хотя на самом деле имеет тип JObject
, поэтому, когда вы перечисляете его, вы фактически перечисляете его JProperty
дочерние элементы. Но вам нужны значения тех JProperty
объектов, которые находятся на один уровень глубже в иерархии:
For Each jProperty As JProperty In options("data")
Dim propertyName = jProperty.Name ' The "89359" names, in case you need them for some reason
Dim opt As JObject = jProperty.Value
Dim name As String = opt("name") ' Cast the name to a String using the JToken implicit casting operator
' Use the name as required
MsgBox(name)
Next
Демонстрационная скрипка здесь.
Ответ №2:
Предполагая, что объект, имеющий свойство name, имеет другие свойства, я бы сделал следующее:
- Создайте класс для представления объекта с помощью свойства name
- Десериализуйте входящие данные в JObject
- Получить элемент «данные» объекта заданий
- Вызовите ToObject с шага 3 в словарь (из целого числа, DataObject)
Вот пример:
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Module Module1
Sub Main()
Dim input As String = "{""data"": {""89359"": {""name"": ""A"" }, ""89360"": {""name"": ""B"" } } }"
Dim data = JsonConvert.DeserializeObject(Of JObject)(input)
Dim dataItems = data.Item("data").ToObject(Of Dictionary(Of Integer, DataObject))
For Each dataItem In dataItems
Console.WriteLine("Key: {0}, DataObject.Name: {1}", dataItem.Key, dataItem.Value.name)
Next
Console.ReadLine()
End Sub
End Module
Public Class DataObject
Public Property name As String
' ...
End Class
Теперь объекты существуют в виде массива с помощью dataItems.Values
метода.
Живой пример: скрипка