2017-12-21 15 views
0

vb.net windowsフォームアプリケーションを使用してJSONコードを解析しようとしています。私のコードはうまく構築されてコンパイルされますが、私のボタンをクリックすると、例外が発生します。vb.netを使用してjsonコードで例外を解析する

Newtonsoft.Json.JsonReaderException: 'NaN値の解析中にエラーが発生しました。パス '、1行目、1位。

例外が私のコードの末尾に次の行を指している:

For Each item As JObject In JArray.Parse(jsonObjects.SelectTokens("items").ToString) 

私はそれを解決しようとしましたが、私はどのようにもう分かりません。ここに私のコードは次のとおりです。

Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim jsonString As String = "{""id"":1, ""name"":""tom"", 
""items"":[ 
    {""name"":""apple"", ""count"":1 }, 
    {""name"":""milk"", ""count"":2 } 
] 
}" 
     Dim jsonObjects As JObject = JObject.Parse(jsonString) 
     Console.WriteLine("id:" & jsonObjects.SelectTokens("id").ToString) 
     Console.WriteLine("name:" & jsonObjects.SelectTokens("name").ToString) 

     Console.WriteLine("items:" & jsonObjects.SelectTokens("items").ToString) 
     'Dim jsonArray As JArray = JArray.Parse(jsonObjects.SelectTokens("items").ToString) 
     For Each item As JObject In JArray.Parse(jsonObjects.SelectTokens("items").ToString) 
      Console.WriteLine("item:" & item.SelectTokens("name").ToString) 
     Next 
    End Sub 
End Class 
+2

例外は常にそれらに関連付けられている説明があります。その情報を共有していないので、私たちはどの問題を解決しているのか分かりません。いくつかのこと以上のものを取得しようとしている場合は、NETオ​​ブジェクトのコレクションに逆シリアル化する方が簡単かもしれません。 – Plutonix

+0

例外に関する詳細を追加すると、他の人があなたの質問を分析するのに役立ちます。私の最初の考えは、JSONを正しく逆シリアル化するためのカスタムハンドラを追加する必要があるかもしれないということです。 Newtonsoft.Json.JsonConverterクラスを見てください – tatmanblue

+0

3つの 'WriteLine'の結果をバックアップして調べたいのですが、' SelectTokens'はJTokenと 'ToString()'のIEnumerableを返します。 – Plutonix

答えて

0

I am trying to ... parse through some JSON

あなたはループの開始時に例外を取得する前に、この文句を言わないの結果は非常に便利なもので:

Console.WriteLine("id:" & jsonObjects.SelectTokens("id").ToString) 

IEnumerable(Of Newtonsoft.Json.Linq.JToken)を返しSelectTokens。あなたはおそらくNETオブジェクトまたはコレクションにそれをデシリアライズするために容易になるだろうJSON全体からいくつかのアイテムが必要な場合は

Newtonsoft.Json.Linq.JsonPath.FieldFilter+<ExecuteFilter>d__0 

、しかし、あなたが尋ねたものではないthatsの:ToStringでそれを表示しようとするだけになります。

Dim jobj = JObject.Parse(Candyjson) 

' print the Id, name and how many items there are 
Console.WriteLine("Id: {0} Name: {1} has {2} Items", jobj("id"), jobj("name"), 
        jobj("items").Count) 

' print each item name and how many there are 
For n As Int32 = 0 To jobj("items").Count - 1 
    Console.WriteLine("Item: {0}, Count: {1}", 
          jobj("items")(n)("name"), 
          jobj("items")(n)("count") 
          ) 
Next 

結果::これはトムが持っているアイテムが一覧表示されます

イド:1名:トムは2つのアイテム
項目があります:リンゴを、数:1
アイテム:牛乳を、数: 2

JSONを解析すると、結果として得られるJObjectには、JSONの内容に応じてさまざまなものが含まれます。ブレークポイントを設定し、jobjを調べると、結果はあなたのJSON(文字列)とほぼ同じになりますが、それはあなたが照会することができる形態である:

enter image description here

関連する問題