2011-11-02 16 views
10

私はjsonレスポンスを逆シリアル化しようとしていますが、その値を取得しようとするとnullエラーにはなりません。直列化復元エラー:値をnullにすることはできません。パラメータ名:タイプ

本当にありがとうございます!私はこのように多くの他の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:値をnullにすることはできません。 パラメータ名:それが役に立つならばここでタイプ

は、スタックトレースです:

[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 

答えて

15

問題はJSONの__typeフィールドにあります。以下にその答えを読む

Problem with deserializing JSON on datamember “__type”引用ようだ:the "__type" field has a special meaning for DataContractJsonSerializer, denoting the type to which the object should be deserialized.

JSONから__typeを削除しても問題が解決しました。

JSONを制御できない場合は、JSON.NETライブラリでこれをテストしたところ、エラーなしでデシリアライズすることができました。

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

優秀!このソリューションを見つけるために多くの時間をウェブ上でサーフィンしていました – f0rza

0
  1. あなたから見ることができるように例外がSystem.Activator.CreateInstance(タイプタイプ、ブール値)メソッドからスローされますスタックトレース。
  2. デシリアライザは、上記のメソッドに「型」としてnullを渡すため、スローされます。

おそらく、デシリアライザはJSONをデシリアライズするための適切な型を見つけることができないためです。最初にLocationResponseクラスのインスタンスをシリアル化し、デシリアライズしようとしている文字列と結果を比較してください。

1

これは遅れているが、私は同じ問題を持っていたし、問題のクラスにデフォルトコンストラクタを追加し、そのクラスのプロパティのセッターはパブリックたことを確認することによってそれを解決しました。これは私の問題を解決しました(FastJsonとJSON.netの両方に存在します)。

誰かが問題を抱えていて、上記の回答が問題を抱えている場合は、

関連する問題