0

我目前正在使用 Json 反序列化代码。这是我的问题:

在 Json 文件中,我遇到了一个如下所示的数组:

"location":[47.618832,-122.21599]

我可以很容易地解析成一个双数组:

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

但我想在这种情况下生成一个对象,让我们调用它在其他命名空间中定义locationCoordinate类型。它有这样的构造函数:

public Coordinate(double lat, double long)

那么有没有办法在这种情况下直接生成一个坐标对象?

谢谢

4

4 回答 4

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;}
}
于 2012-07-16T17:20:26.353 回答
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;
   }

}

我只是把它放在一起,可能会使 Coordinate 类型不可变,并确保我覆盖了 Equals 和 == 运算符的比较。

于 2012-07-16T17:30:32.553 回答
0

您可以实现IDataContractSurrogate接口,该接口

提供在 XML 模式文档 (XSD) 的序列化、反序列化以及导出和导入期间由 DataContractSerializer 将一种类型替换为另一种类型所需的方法。

于 2012-07-16T17:23:54.563 回答
0

我没有直接与 JSon 合作,但你可以有一个 Location 属性获取/设置的 Coordinate 属性:

// 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]);
        }
}

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

于 2012-07-16T17:24:19.623 回答