反序列化错误:值不能为null.参数名称:类型 [英] Deserialization error: value cannot be null. Parameter name: type

查看:261
本文介绍了反序列化错误:值不能为null.参数名称:类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试反序列化json响应,并且获取的值不能为null错误.

I'm trying to deserialize a json response and am getting the value cannot be null error.

我们非常感谢您的帮助!我正在以这种方式反序列化许多其他json字符串,并且从未遇到过此错误.我不确定是什么原因造成的.谢谢!

Any help is really appreciated! I'm deserializing a lot of other json strings this way and have never run into this error. I'm not sure what's causing it. Thanks!

这是对象的代码:

[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:值不能为null. 参数名称:类型

I am getting an error and I can't figure out what part of the code or json is giving this error: Exception Details: System.ArgumentNullException: Value cannot be null. Parameter name: type

如果有帮助,这里是堆栈跟踪:

Here is the stack trace if that is helpful:

[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

推荐答案

问题出在JSON中的__type字段.

The problem is with the __type field in the JSON.

阅读以下内容的答案:在数据成员"__type"上反序列化JSON的问题" 似乎引用:the "__type" field has a special meaning for DataContractJsonSerializer, denoting the type to which the object should be deserialized.

Reading the answer to the following: Problem with deserializing JSON on datamember "__type" it seems that quote: the "__type" field has a special meaning for DataContractJsonSerializer, denoting the type to which the object should be deserialized.

从JSON中删除__type解决了该问题.

Removing __type from the JSON resolved the issue.

一个选项,(如果您无法控制JSON),我刚刚使用 JSON.NET进行了测试库,它可以按预期工作,反序列化没有错误.

One option, (if you have no control over the JSON), I have just tested this with the JSON.NET library and it worked as expected, deserializing with no errors.

LocationResponse response = JsonConvert.DeserializeObject<LocationResponse>(json);

这篇关于反序列化错误:值不能为null.参数名称:类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆