2016-06-29 5 views
0

以下のJSON入力を処理しようとしています。私は私が間違ってVB.NET Json Parse

Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 

何をやっていると、この名前空間にアクセス

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 

:コード

[ 
{ 
"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 
       } 
       ], 
      } 
     ] 
     } 
    } 
} 

:コード(下)

Error reading JObject from JsonReader. 
Current JsonReader item is not an object: StartArray. 
Path '', line 1, position 1. 

入力を投げますか?

+0

これは有効なJSONではありませんが、それを逆シリアル化しないのはなぜですか?私は質問が – Plutonix

+0

@Plutonixの「写真」の値が解析されていないかどうかわかりません。 JsonReaderからJObjectを読み込む際にエラーが発生しました。現在のJsonReaderアイテムはオブジェクトではありません:StartArray。パス '、1行目、1位。このエラー –

+0

フォーマットが改善されました。質問本体にエラーメッセージを追加しました。 – Prune

答えて

0

有効でないため、JSONLintを使用してJSONをデバッグしました。あなたのソースがあなたに無効なJSONを送信しているのか、ここに投稿しているときにタイプミスがあったのかをチェックする必要があります。 (>クリップボードにJSONをコピーしてEditを使用して貼り付け>クラスとしてJSONを貼り付け)、あなたがJSON Utilsのようにまたはそれ自体VSツールを使用することができます次に

[{ 
    "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 
       }] 
      }] 
     } 
    }] 
}] 

そのVBクラスを生成する:これは有効なJSONになります試合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

良い、ありがとう、良い働き! –