C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 取得したjsonデータの展開ができません


(過去ログ 116 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■68492 / inTopicNo.1)  取得したjsonデータの展開ができません
  
□投稿者/ torapis22 (1回)-(2013/10/23(Wed) 17:41:00)

分類:[VB.NET/VB2005 以降] 

VisualBasicでWindowsアプリを作っています。
Visual Studio 2010を使っています。

リモートサーバにWebClientクラスで接続し、Json形式のデータで受け取って
出力しようと考えています。

ところが、※※印のところでエラーが出てしまいます。
「指定されたキーはディレクトリ内に存在しませんでした。」

その前の変数(obj_data)を見るとデータはセットされており、通信はできているようです。
でも配列の展開がうまくいきません。

どなたか教えて頂けませんでしょうか。
よろしくお願いします。


Private Sub searchDataJson2()
	Dim url As String = "url"

	Dim wc As New System.Net.WebClient

	'NameValueCollectionの作成
	Dim ps As New System.Collections.Specialized.NameValueCollection

	'送信するデータ(フィールド名と値の組み合わせ)を追加
	ps.Add("slipNo", "2")

	'データを送信し、結果を受信する
	Dim resData As Byte()
	resData = wc.UploadValues(url, ps)
	wc.Dispose()

	'受信したデータの文字コードをUTFに設定
	Dim resText As String = System.Text.Encoding.UTF8.GetString(resData)

	'JSONでデコード
	Dim obj_data As Object = getJsonData(resText)

	'カウント
	Dim int_count As Integer


	'配列の子数分ループ
	For int_count = 0 To obj_data.Length - 1

		'配列内のデータを出力
                Console.WriteLine("salsId" + obj_data(int_count)(0))
                Console.WriteLine("customerId" + obj_data(int_count)(1))
                Console.WriteLine("salsCategory:" + obj_data(int_count)(2))
                Console.WriteLine("slipNo:" + obj_data(int_count)(3))
	Next

End Sub

    '指定された文字列をJSON型でデコード
    Function getJsonData(ByVal str_result As String) As Object
        'JSON用のオブジェクト
        Dim jss_serial As Web.Script.Serialization.JavaScriptSerializer = New Web.Script.Serialization.JavaScriptSerializer

        'デコード処理をかける
        Dim obj_data As Object = jss_serial.Deserialize(Of Object)(str_result)
        Return obj_data

    End Function

引用返信 編集キー/
■68495 / inTopicNo.2)  Re[1]: 取得したjsonデータの展開ができません
□投稿者/ Hongliang (107回)-(2013/10/23(Wed) 21:36:03)
肝心のJsonデータの内容がないと答えようがないです。
引用返信 編集キー/
■68496 / inTopicNo.3)  Re[1]: 取得したjsonデータの展開ができません
□投稿者/ 魔界の仮面弁士 (392回)-(2013/10/23(Wed) 21:56:39)
No68492 (torapis22 さん) に返信
> ところが、※※印のところでエラーが出てしまいます。
> 「指定されたキーはディレクトリ内に存在しませんでした。」

「※※印」は何処でしょうか?
引用返信 編集キー/
■68497 / inTopicNo.4)  Re[2]: 取得したjsonデータの展開ができません
□投稿者/ torapis22 (3回)-(2013/10/24(Thu) 09:47:14)
No68496 (魔界の仮面弁士 さん) に返信
> ■No68492 (torapis22 さん) に返信
>>ところが、※※印のところでエラーが出てしまいます。
>>「指定されたキーはディレクトリ内に存在しませんでした。」
> 
> 「※※印」は何処でしょうか?


素早いご返答ありがとうございました。

大変失礼しました。

まず、返ってきたJsonデータは以下です。

[{"salsId":"2","customerId":"1","salsCategory":"11","slipNo":"2"},{"salsId":"3","customerId":"1","salsCategory":"11","slipNo":"2"}]


また、エラーの出たところは出力しようとしたところです。


		'配列内のデータを出力
                Console.WriteLine("salsId" + obj_data(int_count)(0))   ←←←※※※
                Console.WriteLine("customerId" + obj_data(int_count)(1))
                Console.WriteLine("salsCategory:" + obj_data(int_count)(2))
                Console.WriteLine("slipNo:" + obj_data(int_count)(3))



エラーについてもう少し詳しく書くと、

System.Collections.Generic.KeyNotFoundException
指定されたキーはディレクトリ内に存在しませんでした。

となっています。
「ディクショナリ」でなく、「ディレクトリ」となっています。


よろしくお願いします。







引用返信 編集キー/
■68498 / inTopicNo.5)  Re[3]: 取得したjsonデータの展開ができません
□投稿者/ Hongliang (108回)-(2013/10/24(Thu) 10:03:07)
> [{"salsId":"2","customerId":"1","salsCategory":"11","slipNo":"2"},{"salsId":"3","customerId":"1","salsCategory":"11","slipNo":"2"}]

JavaScriptSerializerは、変換方法を明示しない場合、配列はObject()に、キー値ペアはDictionary(Of String, Object)に変換するようです。

> Console.WriteLine("salsId" + obj_data(int_count)(0))   ←←←※※※

obj_data(int_count)はDictionary(Of String, Object)を返しますが、
DictionaryはIntegerでアクセスできるインデクサを持っていません。
(Dictionaryは順序付きではないので、どのアイテムがインデックス0なのか決定できません)
ですのでエラーになっています。
obj_data(int_count)("selsId")
のようにキー文字列でアクセスするのが基本です。

.Values.ToArray()(0)
のようにしてインデックスでアクセスすることも不可能ではないですが、
前述のようにDictionaryは順序付きではないので、インデックス0で返される値は
salsIdキーのものであることもあればsalsCategoryキーのものであることもあり、
おそらく実用性はありません。

単純に全部表示させたいだけなら、
For Each pair As KeyValuePair(Of String, Object) In obj_data
    Console.WriteLine("{0} : {1}", pair.Key, pair.Value);
Next
のように列挙させる方法があります。

引用返信 編集キー/
■68499 / inTopicNo.6)  Re[4]: 取得したjsonデータの展開ができません
□投稿者/ torapis22 (4回)-(2013/10/24(Thu) 11:03:08)
No68498 (Hongliang さん) に返信
> > [{"salsId":"2","customerId":"1","salsCategory":"11","slipNo":"2"},{"salsId":"3","customerId":"1","salsCategory":"11","slipNo":"2"}]
>
> JavaScriptSerializerは、変換方法を明示しない場合、配列はObject()に、キー値ペアはDictionary(Of String, Object)に変換するようです。
>
>>Console.WriteLine("salsId" + obj_data(int_count)(0))   ←←←※※※
>
> obj_data(int_count)はDictionary(Of String, Object)を返しますが、
> DictionaryはIntegerでアクセスできるインデクサを持っていません。
> (Dictionaryは順序付きではないので、どのアイテムがインデックス0なのか決定できません)
> ですのでエラーになっています。
> obj_data(int_count)("selsId")
> のようにキー文字列でアクセスするのが基本です。
>
> .Values.ToArray()(0)
> のようにしてインデックスでアクセスすることも不可能ではないですが、
> 前述のようにDictionaryは順序付きではないので、インデックス0で返される値は
> salsIdキーのものであることもあればsalsCategoryキーのものであることもあり、
> おそらく実用性はありません。
>
> 単純に全部表示させたいだけなら、
> For Each pair As KeyValuePair(Of String, Object) In obj_data
> Console.WriteLine("{0} : {1}", pair.Key, pair.Value);
> Next
> のように列挙させる方法があります。



素早い回答ありがとうございます。

教えて頂いた通り、文字列キーを入れたら、Jsonを拾ってくれました。


ありがとうございます。
大助かりです。






解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -