2012-07-16 140 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的比較與==操作符。