2012-07-16 141 views
0

我目前正在使用Json反序列化代码。这里是我的问题:解析Json数组到对象中

在我遇到了一个数组JSON文件看起来是这样的:

"location":[47.618832,-122.21599] 

对于那些我可以轻松地解析成一个双数组:

[DataMember(Name = "location")] 
public double[] Location { get; set; } 

但我想在这种情况下生成一个对象,我们称它为的Coordinate类型在其他命名空间中定义。它的构造是这样的:

public Coordinate(double lat, double long)

那么,有没有办法,我可以生成一个直接在此情况下,协调对象?

谢谢

回答

1

不直接,但更清洁的方式。

public class MyClass 
{ 
     [DataMember(Name = "location")] 
     public double[] Location { get; set; } 

     public Coordinate Coordinate 
     { 
      get 
      { 
        if(Location.Lenght > 2) 
        { 
         return new Coordinate() { Lat = Location[0], Lang = Location[1] }; 
        } 

        return null; 
      } 
     } 

} 

public class Coordinate 
{ 
     public double Lat { get; set;} 
     public double Lang { get; set;} 
} 
0

您可以实现IDataContractSurrogate接口,

提供了由 DataContractSerializer的序列化,反序列化过程中替换一个类型为另一个所需的方法和 出口和进口的XML模式文档(XSD )。

0

我还没有和JSON的工作直接,但你可以有一个坐标位置属性获取属性/套:

// Not affected by JSon deserialization 
[ScriptIgnore] 
public Coordinate Coordinate {get; set;} 

// Serialized/Deserialized by JSon 
public double[] Location { 
    get 
     { 
      return new double[] {Coordinate.Latitude,Coordinate.Longitude}; 
     } 
    set 
     { 
      Coordinate = new Coordinate(value[0],value[1]); 
     } 
} 

当然,你应该添加适当的边界检查等

1

您可以将解析的数据标记为私有,并按照您希望的方式公开。

public class MyClass 
{ 
    public struct Coordinate 
    { 
     public double Lat; 
     public doubel Lon; 
    } 

    [DataMember(Name = "location")] 
    private double[] _Location { get; set; } 

    public Coordinate Location 
    { 
     get 
     { 
      return new Coordinate { Lat = _Location[0], Lon = _Location[1]}; 
     } 
     set 
     { 
      double[0] = value.Lat; 
      double[1] = value.Lon; 
    } 

} 

我只是把这个在一起,很可能会令该坐标类型不变,并确保我推翻的Equals的比较与==操作符。