【问题标题】:Parse Json array into object将 Json 数组解析为对象
【发布时间】:2012-07-16 17:11:46
【问题描述】:

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

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

"location":[47.618832,-122.21599]

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

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

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

public Coordinate(double lat, double long)

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

谢谢

【问题讨论】:

    标签: c# json parsing deserialization


    【解决方案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;}
    }
    

    【讨论】:

      【解决方案2】:

      您可以将解析后的数据标记为私有并以您想要的方式公开它。

      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 和 == 运算符的比较。

      【讨论】:

        【解决方案3】:

        你可以实现IDataContractSurrogate接口

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

        【讨论】:

          【解决方案4】:

          我没有直接使用 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]);
                  }
          }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 2020-05-02
            • 1970-01-01
            • 1970-01-01
            • 2014-12-02
            • 2014-08-21
            相关资源
            最近更新 更多