Я пытаюсь обработать ввод JSON ниже. Код (внизу) бросает
Error reading JObject from JsonReader.
Current JsonReader item is not an object: StartArray.
Path '', line 1, position 1.
Вход:
[
{
"data": [
{
"photos": {
"data": [
{
"id": "1",
"name": "test Post",
"images": [
{
"height": 1024,
"source": "https://127.0.0.1:8080/image1.png",
"width": 1204
},
{
"height": 1204,
"source": "https://127.0.0.1:8080/image2.png",
"width": 1204
}
],
}
]
}
}
}
Код:
Dim ser As JObject = JObject.Parse(result.ToString)
Dim data As List(Of JToken) = ser.Children().ToList
Dim jsonString As String = Nothing
Dim index As Integer = 0
For Each item As JProperty In data
item.CreateReader()
Select Case item.Name
Case "data"
jsonString = item.Value.ToString
End Select
Next
ser = JObject.Parse(jsonString)
data = ser.Children().ToList
For Each item As JProperty In data
item.CreateReader()
Select Case item.Name
Case "photos"
jsonString = item.Value.ToString
End Select
Next
ser = JObject.Parse(jsonString)
data = ser.Children().ToList
For Each item As JProperty In data
item.CreateReader()
Select Case item.Name
Case "data"
For Each comment As JObject In item.Values
Dim _id As String = comment("id")
Dim _title As String = comment("title")
Dim _name As String = comment("name")
Dim _source As String = comment("source")
Dim source As List(Of JToken) = item.Value.ToList
For Each images As JProperty In source
item.CreateReader()
Select Case item.Name
Case "images"
Dim _tempsource As String = source("source")
_source += _tempsource & vbCrLf
End Select
Next
Dim _created_time As String = comment("created_time")
Dim itm As New ListViewItem(_id, 1)
itm.SubItems.Add(_title)
itm.SubItems.Add(_name)
itm.SubItems.Add(_source)
itm.SubItems.Add(_created_time)
lvItems.Items.AddRange(New ListViewItem() {itm})
index += 1
Next
End Select
Next
Я получаю доступ к этому пространству имен с помощью
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Что я делаю не так?
1 ответ
Я использовал JSONLint для отладки вашего JSON, поскольку он недействителен. вы должны проверить, отправляет ли ваш источник вам недопустимый JSON, или при размещении его здесь была опечатка. Это будет действительным JSON:
[{
"data": [{
"photos": {
"data": [{
"id": "1",
"name": "test Post",
"images": [{
"height": 1024,
"source": "https://127.0.0.1:8080/image1.png",
"width": 1204
}, {
"height": 1204,
"source": "https://127.0.0.1:8080/image2.png",
"width": 1204
}]
}]
}
}]
}]
Затем Вы можете использовать такой инструмент, как JSON Utils, или сам VS (скопировав JSON в буфер обмена и используя Редактировать > Специальная вставка > Вставить JSON как классы), чтобы создать классы VB, соответствующие структуре JSON:
Public Class Image
Public Property height As Integer
Public Property source As String
Public Property width As Integer
End Class
Public Class PhotoDatum
Public Property id As String
Public Property name As String
Public Property images As Image()
End Class
Public Class Photos
Public Property data As PhotoDatum()
End Class
Public Class Datum
Public Property photos As Photos
End Class
Public Class SER
Public Property data As Datum()
End Class
В любом случае, если вы добавите указанные выше классы в свой проект, вы можете просто сделать это:
Dim MySER = JsonConvert.DeserializeObject(Of SER)(jsonString)
Dim itm As ListViewItem
Dim MyItems As New List(Of ListViewItem)
For Each d In MySER
If d.photos IsNot Nothing Then
For each dd in d.photos.data
If dd.images IsNot Nothing Then
For each img In dd.images
itm = New ListViewItem(dd.id, 1)
itm.SubItems.Add(dd.name)
itm.SubItems.Add(img.source)
MyItems.Add(itm)
Next
End If
Next
End If
Next
lvItems.Items.AddRange(MyItems)
И работайте со своими структурированными объектами.
id
, name
и source
. Если ваш JSON предоставляет больше данных, вам нужно добавить соответствующие поля в свои классы. Удачи!
Похожие вопросы
Новые вопросы
json
JSON (нотация объектов JavaScript) — это сериализуемый формат обмена данными, который может быть прочитан машиной и человеком. Не используйте этот тег для собственных объектов JavaScript или литералов объектов JavaScript. Прежде чем задать вопрос, подтвердите свой JSON с помощью валидатора JSON, такого как JSONLint (https://jsonlint.com).