Как устранить KeyNotFoundException

Я использую следующее для десериализации строки JSON в свой класс:

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

Но как только вызывается метод 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)

Но опять же, я ищу общую технику больше, чем просто решить этот конкретный случай.

2 ответа

Отбросьте точку останова в инструкции Deserialize, затем используйте окно Immediate для ввода x["d"].ToString(). Это скажет вам, что это оценивает, что будет приравниваться к ключу, который вы пытаетесь десериализовать.

Если вы получите ошибку при оценке этого, то ваш x словарь не имеет "d" в качестве ключа, что еще одно, что вы можете проверить.

EDIT: Я не думаю, что Дэниел предлагал вам полностью удалить ["d"]. Если вы это сделаете, вы передаете Deserialize словарь, когда он довольно четко ожидает строку. Такое несоответствие типа вызывает появление новой ошибки. Вместо этого Даниэль предполагает, что словарь, который у вас есть, не включает "d" в качестве действительного ключа. Что это может или не может быть, я не уверен.


Вероятно, на вашем x доступ к значению для d.

licensed under cc by-sa 3.0 with attribution.