2016-06-29 7 views
0

아래 JSON 입력을 처리하려고합니다. 코드 (하단)가 발생VB.NET Json Parse

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

유효하지 않은 JSON입니다. 그렇다면 왜 비 직렬화하지 않습니까? 질문에서 – Plutonix

+0

@Plutonix 'photos'값이 파싱되지 않았는지 확실하지 않습니다. 프로그램 throw JsonReader에서 JObject를 읽는 중 오류가 발생했습니다. 현재 JsonReader 항목이 객체가 아닙니다 : StartArray. 경로 ', 줄 1, 위치 1' 이 오류 –

+0

향상된 형식; 질문 본문에 오류 메시지를 추가했습니다. – Prune

답변

0

유효하지 않기 때문에 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처럼 또는 자체 (클립 보드에 JSON을 복사 및 클래스로 JSON 붙여 넣기> 붙여 넣기>편집을 사용하여) VB 클래스를 생성 VS 도구를 사용할 수 있습니다 경기 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

멋지지만 'foreach'에서 일하고 싶습니다. 어떻게해야합니까? –

+0

@LemonKnife, 나는 내 게시물을 편집하고 전환 진술 뒤에 간단한 코드 스크랩을 추가했습니다. 살펴본 다음 필요에 맞게 수정 해보십시오. 코드에서 ListView에 수집하고 삽입하려는 메타 데이터가 더 많지만 붙여 넣은 JSON에는 'id', 'name' 및'소스'. JSON이 더 많은 데이터를 제공하면 클래스에 해당 필드를 추가해야합니다. 행운을 빕니다! – VBobCat

+0

좋은, 잘 했어! –