将Json数组解析为对象

时间:2012-07-16 17:11:46

标签: c# json parsing deserialization

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

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

"location":[47.618832,-122.21599]

我可以轻松解析为双数组:

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

但我希望在这种情况下生成一个对象,让我们调用另一个名称空间中定义的location类型的Coordinate。它有这样的构造函数:

public Coordinate(double lat, double long)

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

谢谢

4 个答案:

答案 0 :(得分: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;}
}

答案 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;
   }

}

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

答案 2 :(得分:0)

您可以实施<{3}}界面

  

提供将一种类型替换为另一种类型所需的方法   DataContractSerializer在序列化,反序列化和   导出和导入XML架构文档(XSD)。

答案 3 :(得分: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]);
        }
}

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