Я пытаюсь обработать ввод 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

Что я делаю не так?

0
Lemon Knife 29 Июн 2016 в 19:05
Это недопустимый JSON, если это так, почему бы не десериализовать его? Я не уверен, в чем вопрос
 – 
Ňɏssa Pøngjǣrdenlarp
29 Июн 2016 в 19:10
'фотографии' из значения не разбираются. Программа Throw 'Ошибка чтения JObject из JsonReader. Текущий элемент JsonReader не является объектом: StartArray. Путь '', строка 1, позиция 1. ' Эта ошибка
 – 
Lemon Knife
29 Июн 2016 в 19:13
Улучшено форматирование; добавлено сообщение об ошибке в текст вопроса.
 – 
Prune
1 Июл 2016 в 19:48

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)

И работайте со своими структурированными объектами.

0
Nimantha 11 Дек 2021 в 14:29
Хорошо, но я хочу работать в «foreach». Что мне делать?
 – 
Lemon Knife
30 Июн 2016 в 00:57
@LemonKnife, я отредактировал свой пост и добавил небольшой фрагмент кода после оператора преобразования. Взгляните и попробуйте адаптировать его к вашим потребностям ... Я увидел в вашем коде, что есть больше метаданных, которые вы хотели бы собрать и вставить в свой ListView, но вставленный вами JSON содержит только id, name и source. Если ваш JSON предоставляет больше данных, вам нужно добавить соответствующие поля в свои классы. Удачи!
 – 
VBobCat
30 Июн 2016 в 01:19