Как выполнять цикл для динамических объектов заданий в другом объекте заданий?

#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, имеет другие свойства, я бы сделал следующее:

  1. Создайте класс для представления объекта с помощью свойства name
  2. Десериализуйте входящие данные в JObject
  3. Получить элемент «данные» объекта заданий
  4. Вызовите 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 метода.

Живой пример: скрипка