4

以下を使用して、JSON文字列を自分のクラスに逆シリアル化します。

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> x = (Dictionary<string, object>)serializer.DeserializeObject(json);
MyJsonStruct data = serializer.Deserialize<MyJsonStruct>(x["d"].ToString());

ただし、メソッドが呼び出されるとすぐにJavaScriptSerializer.Deserialize()、例外がスローされます。

A first chance exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.dll
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)

どのキーが例外をトリガーしたかを見つける方法はありますか?

このタイプの例外をトラブルシューティングするための一般的な手法(またはレシピ)をいただければ幸いです。

更新:を削除すると[d]、次のようになります。

A first chance exception of type 'System.ArgumentException' occurred in System.Web.Extensions.dll
System.ArgumentException: Invalid JSON primitive: System.Collections.Generic.Dictionary.
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)

しかし、繰り返しになりますが、私はこの特定のインスタンスを解決するだけではなく、一般的な手法を探しています。

4

2 に答える 2

5

Deserializeステートメントにブレークポイントをドロップし、イミディエイトウィンドウを使用して入力しx["d"].ToString()ます。これにより、それが何に評価されるかがわかります。これは、逆シリアル化しようとしているキーに相当します。

それを評価しているときにエラーが発生した場合、xディクショナリにはキーとして「d」がありません。これはもう1つ確認できます。

["d"]編集:ダニエルはあなたが完全に削除することを提案していたとは思わない。これを行うと、文字列をかなり明確に期待しているときに、辞書の逆シリアル化を渡すことになります。このタイプの不一致が、新しいエラーの原因です。"d"代わりに、ダニエルはあなたが持っている辞書が有効なキーとして含まれていないことを示唆しています。どちらかどうかはわかりません。

于 2012-10-23T19:40:31.167 に答える
1

xの値にアクセスしている可能性がありますd

于 2012-10-23T19:40:15.050 に答える