Ошибка десериализации: значение не может быть нулевым.Имя параметра: тип - PullRequest
11 голосов
/ 03 ноября 2011

Я пытаюсь десериализовать ответ json и получаю значение, которое не может быть нулевой ошибкой.

Любая помощь действительно приветствуется!Таким образом, я десериализую множество других строк json и никогда не сталкивался с этой ошибкой.Я не уверен, что вызывает это.Спасибо!

Вот код для объекта:

[Serializable]
public class LocationResponse
{
    public string authenticationResultCode { get; set; }
    public string brandLogoUri { get; set; }
    public string copyright { get; set; }
    public List<ResourceSet> resourceSets { get; set; }
    public int statusCode { get; set; }
    public string statusDescription { get; set; }
    public string traceId { get; set; }
}

[Serializable]
public class ResourceSet
{
    public int estimatedTotal { get; set; }
    public List<Resource> resources { get; set; }
}

[Serializable]
public class Resource
{
    //public string __type { get; set; }
    //public List<double> bbox { get; set; }
    public string name { get; set; }
    public Point point { get; set; }
    //public Address address { get; set; }
    //public string confidence { get; set; }
    //public string entityType { get; set; }
}

[Serializable]
public class Point
{
    public string type { get; set; }
    public List<double> coordinates { get; set; }
}

[Serializable]
public class Address
{
    public string countryRegion { get; set; }
    public string formattedAddress { get; set; }
}

Код для десериализации:

System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = "{\"authenticationResultCode\":\"ValidCredentials\",\"brandLogoUri\":\"http:\\/\\/dev.virtualearth.net\\/Branding\\/logo_powered_by.png\",\"copyright\":\"Copyright © 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.\",\"resourceSets\":[{\"estimatedTotal\":1,\"resources\":[{\"__type\":\"Location:http:\\/\\/schemas.microsoft.com\\/search\\/local\\/ws\\/rest\\/v1\",\"bbox\":[33.177484847720336,35.531577579036423,33.235425613705445,35.623878963932327],\"name\":\"Qiryat Shemona, Israel\",\"point\":{\"type\":\"Point\",\"coordinates\":[33.206455230712891,35.577728271484375]},\"address\":{\"adminDistrict\":\"Northern\",\"countryRegion\":\"Israel\",\"formattedAddress\":\"Qiryat Shemona, Israel\",\"locality\":\"Qiryat Shemona\"},\"confidence\":\"High\",\"entityType\":\"PopulatedPlace\"}]}],\"statusCode\":200,\"statusDescription\":\"OK\",\"traceId\":\"NVM001351\"}";
LocationResponse response = ser.Deserialize<LocationResponse>(json);

Я получаю ошибку и не могу понятькакая часть кода или json выдает эту ошибку: Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым.Имя параметра: тип

Вот трассировка стека, если это полезно:

[ArgumentNullException: Value cannot be null.
Parameter name: type]
System.Activator.CreateInstance(Type type, Boolean nonPublic) +7468694
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +406
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) +21
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +181
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth) +119
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +210
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) +422
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +147
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth) +119
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +210
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) +422
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +147
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer) +51
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) +37
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input) +70

Ответы [ 3 ]

16 голосов
/ 03 ноября 2011

Проблема с полем __type в JSON.

Чтение ответа на следующий вопрос: Проблема с десериализацией JSON для элемента данных «__type» , кажется, что цитата: the "__type" field has a special meaning for DataContractJsonSerializer, denoting the type to which the object should be deserialized.

Удаление __type из JSON решило проблему.

Один вариант (если у вас нет контроля над JSON), я только что проверил это с библиотекой JSON.NET , и она работала как ожидалось, десериализовалась без ошибок.

LocationResponse response = JsonConvert.DeserializeObject<LocationResponse>(json);
1 голос
/ 21 мая 2013

Это поздно, но у меня возникла та же проблема, и я решил ее, добавив конструктор по умолчанию к рассматриваемому классу и убедившись, что установщики свойств этого класса были общедоступными. Это решило мою проблему (присутствует как с FastJson, так и с JSON.net).

На всякий случай, если у кого-то возникнут проблемы, и ответы выше не помогут им.

1 голос
/ 03 ноября 2011
  1. Исключение выдается из метода System.Activator.CreateInstance (Type type, bool), как вы можете видеть из трассировки стека.
  2. Это выбрасывается, потому что десериализатор передает null как "тип"метод, о котором я упоминал выше.

Скорее всего, это происходит потому, что десериализатор не может найти подходящий тип для десериализации JSON.Попробуйте сначала сериализовать экземпляр вашего класса LocationResponse и сравните результат со строкой, которую вы пытаетесь десериализовать.

...