2010-09-11 90 views
4

我试图使用JSON.NET库解析出oodle.com api提要中的数据。响应JSON字符串反序列化的一部分,具有以下“位置”的结构:无法将JSON数组反序列化为foo类型

"location":[], 

我试图反序列化:

"location":{ 
"address":"123 foo Street", 
"zip":"94102", 
"citycode":"usa:ca:sanfrancisco:downtown", 
"name":"San Francisco (Downtown)", 
"state":"CA", 
"country":"USA", 
"latitude":"37.7878", 
"longitude":"-122.4101"}, 

声明为一个空数组的位置,但是我见过实例在一类类型的位置数据中。当位置具有有效数据时,这种方法非常完美,但当位置表示为空数组时,这种方法效果不佳。我尝试添加属性(NullValueHandling &必需),如果数据确实是一个空数组,则将位置实例设置为null,但我认为这些属性仅用于序列化。如果数组是空的,我得到一个例外

Cannot deserialize JSON array into type 'LocationData' 

有没有办法告诉解串器不抱怨,使定位对象为null如果数组反序列化失败? 谢谢!

[JsonProperty(NullValueHandling = NullValueHandling.Ignore,Required=Required.AllowNull)] 
public LocationData location{get;set;} 
    ... 
public class LocationData 
    { 
      public string zip { get; set; } 
      public string address { get; set; } 
      public string citycode { get; set; } 
      public string name { get; set; } 
      public string state { get; set; } 
      public string country { get; set; } 
      public decimal latitude { get; set; } 
      public decimal longitude { get; set; } 
    } 
+1

有在你的第一个例子中,没有数组,但有一个在你的第二个空单...确实JSON。 NET关心“位置”数据是什么(单个对象或对象数组)? – 2010-09-11 17:23:25

+0

好点。我只注意到了这一点。我会联系数据提供者(oodle.com dev api)尝试获得解释。这种情况下的数据类型似乎不同于天气是有数据还是为空。有没有可以包含两者的数据结构?是否有一个技巧告诉JSON.NET将它序列化为LocationData(如果它有数据,否则只要将NULL置于空数组中)? – Ash 2010-09-12 14:59:25

+1

问题变成了PHP的JSON构造。 位置对象被定义为散列$ somehash = array();并填充为: if($ foo) {location} {'foo'} = $ foo; } 在PHP json_encode转换$ somehash到somehash []即使$ somehash旨在被用作散列对象而不是数组... 因此溶液没有实例变量$ somehash =阵列( );直到你有第一个项目填充。这会将json对象序列化为NULL而不是数组。 – Ash 2010-09-14 18:28:44

回答

2

您可以编写LocationData类型的自定义转换器以将数组令牌变为null。

喜欢的东西:

public class LocationDataConverter : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      if (reader.TokenType == JsonToken.StartArray) 
      { 
       reader.Read(); //move to end array 
       return null; 
      } 

      var data = new LocationData(); 
      serializer.Populate(reader, data); 

      return data; 
     } 
} 

然后,只需将标签类LocationData:

[JsonConverter(typeof(LocationDataConverter))] 
public class LocationData {...}