我是JSON新手,希望将以下JSON转换为. NET中的对象列表。JSON在一个数组中包含两个不同的对象:
[
{
"type":"line",
"a":"-1,5; 3,4",
"b":"2,2; 5,7",
},
{
"type":"circle",
"center":"0; 0",
"radius":15.0,
}
]
下面是相应的C#类:
public class Line : Shape
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
}
public class Circle : Shape
{
public Point Center { get; set; }
public double Radius { get; set; }
}
public abstract class Shape
{
public string type { get; set; }
}
我不确定如何将JSON数据结构Map到Line
和Circle
的C#类。我是否需要.NET中的其他类来桥接C#类和JSON数据结构?我也不确定在这种情况下如何处理坐标。是否可以仅使用.NET来完成此操作,或者我是否需要像JSON.NET这样的库?
**更新:**我想我知道如何反序列化多态对象了。我仍然有一个Map的问题。我如何告诉JSON.NET把一个字符串转换成一个System.Windows.Point
和反过来?
1条答案
按热度按时间vaj7vani1#
剩下的问题是,您试图将包含一对数字的字符串反序列化为
System.Windows.Point
*,而这些数字在语言环境中使用逗号作为十进制分隔符 *。您需要为这种情况创建customJsonConverter
:然后反序列化如下:
您需要使用
JsonConverter
,因为在Json.NET does support serializing objects as strings using their built-inTypeConverter
中,用于将Point
转换为字符串表示形式的PointConverter
似乎存在错误。具体来说,此内置转换器在转换为字符串表示形式时依赖于区域性,但在转换回Point
时不了解区域性。这可以在
PointConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
的参考源代码中看到:请注意,
culture
没有传递到Point.Parse()
。相反,PointConverter.ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
在格式化时确实使用了传入的区域性。这种不一致性是一个bug。为了确认这个错误,如果你尝试往返一个
Point
,比如说,在德国文化中,将会抛出一个异常。下面的代码将会抛出,演示了这个问题: