我目前正在使用Json反序列化代码。这是我的问题:
在Json文件中我遇到了一个如下所示的数组:
"location":[47.618832,-122.21599]
我可以轻松解析为双数组:
[DataMember(Name = "location")]
public double[] Location { get; set; }
但我希望在这种情况下生成一个对象,让我们调用另一个名称空间中定义的location
类型的Coordinate
。它有这样的构造函数:
public Coordinate(double lat, double long)
那么有没有办法在这种情况下直接生成一个Coordinate对象?
谢谢
答案 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]);
}
}
当然你应该添加适当的边界检查等。