是否有一个 Json 库可以同时处理对象数组和抽象数组 类?
Is there a Json library that works with both array of objects and array of abstract classes?
我需要 read/write Json from/to 一个用 XmlSerialization 属性装饰的 POCO。这个 POCO 是从 XSD 生成的。它广泛使用多态性、继承、对象、对象数组和抽象数组 classes。我已经尝试过 JsonFx V2,它看起来很有前途,但不幸的是,这并不能很好地工作,并且在这个开源项目上几年来几乎没有 activity。
感谢任何帮助。
更新 1:AFAIK Json.NET 不知道如何处理 XmlSerialization 属性。
更新 2:ServiceStack V3 似乎可以完成这项工作,但我至少有一个问题。
当 属性 是对象类型时,添加一个 _type 成员,这很好。但是对象数组没有这样的信息。
考虑以下 c# classes :
[System.Xml.Serialization.XmlIncludeAttribute(typeof(adxppostalCode))]
public partial class ADXP : ST
{
...
}
和
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "adxp.postalCode"]
public partial class adxppostalCode : ADXP
{
}
如果对象数组 (object[]) 包含 adxppostalCode 的实例,则在序列化时 Json 中没有类型信息。因此,它在反序列化时将 class ADXP 的实例添加到数组中,而不是 adxppostalCode 的实例。
我希望这只是一个配置问题,因为除了这个行为之外,它运行良好。
Udapte 3 :经过更多测试,Json.NET(至少版本 7.0.1 Beta 3)似乎支持属性并发出正确的类型信息对于对象数组(名称空间和库名称已被删除)。
"Items": [
{
"$type": "adxppostalCode, ....",
"mediaType": "text/plain",
"compressionSpecified": false,
"integrityCheckAlgorithm": 0,
"representation": 1,
"Text": [
"69110"
]
}
]
对于抽象数组class,正确的类型写在输出中。在反序列化时,它会尝试创建抽象基类型的实例,但失败了。例如:
Json片段:
"Items": [
{
"$type": "IVXB_TS, ...",
"inclusive": true,
"value": "20091231"
}
]
无法创建 QTY 类型的实例。类型是接口或抽象class,无法实例化。
Class 层次结构:
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class ANY : object, System.ComponentModel.INotifyPropertyChanged
{
}
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class QTY : ANY
{
}
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public partial class TS : QTY
{
}
public partial class IVXB_TS : TS
{
}
摘要数组class:
[System.Xml.Serialization.XmlElementAttribute("high", typeof(IVXB_TS))]
[System.Xml.Serialization.XmlElementAttribute("low", typeof(IVXB_TS))]
public QTY[] Items
嗯Json.NET 7.0.1 Beta 3 实际上能够处理所有这些情况。
关键要点是反序列化器必须像序列化一样配置为类型处理。我错误地认为 json 文件中可用的类型信息将被自动使用。
可能是早期版本也会做同样的事情。
我需要 read/write Json from/to 一个用 XmlSerialization 属性装饰的 POCO。这个 POCO 是从 XSD 生成的。它广泛使用多态性、继承、对象、对象数组和抽象数组 classes。我已经尝试过 JsonFx V2,它看起来很有前途,但不幸的是,这并不能很好地工作,并且在这个开源项目上几年来几乎没有 activity。
感谢任何帮助。
更新 1:AFAIK Json.NET 不知道如何处理 XmlSerialization 属性。
更新 2:ServiceStack V3 似乎可以完成这项工作,但我至少有一个问题。
当 属性 是对象类型时,添加一个 _type 成员,这很好。但是对象数组没有这样的信息。
考虑以下 c# classes :
[System.Xml.Serialization.XmlIncludeAttribute(typeof(adxppostalCode))]
public partial class ADXP : ST
{
...
}
和
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "adxp.postalCode"]
public partial class adxppostalCode : ADXP
{
}
如果对象数组 (object[]) 包含 adxppostalCode 的实例,则在序列化时 Json 中没有类型信息。因此,它在反序列化时将 class ADXP 的实例添加到数组中,而不是 adxppostalCode 的实例。
我希望这只是一个配置问题,因为除了这个行为之外,它运行良好。
Udapte 3 :经过更多测试,Json.NET(至少版本 7.0.1 Beta 3)似乎支持属性并发出正确的类型信息对于对象数组(名称空间和库名称已被删除)。
"Items": [
{
"$type": "adxppostalCode, ....",
"mediaType": "text/plain",
"compressionSpecified": false,
"integrityCheckAlgorithm": 0,
"representation": 1,
"Text": [
"69110"
]
}
]
对于抽象数组class,正确的类型写在输出中。在反序列化时,它会尝试创建抽象基类型的实例,但失败了。例如:
Json片段:
"Items": [
{
"$type": "IVXB_TS, ...",
"inclusive": true,
"value": "20091231"
}
]
无法创建 QTY 类型的实例。类型是接口或抽象class,无法实例化。
Class 层次结构:
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class ANY : object, System.ComponentModel.INotifyPropertyChanged
{
}
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class QTY : ANY
{
}
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public partial class TS : QTY
{
}
public partial class IVXB_TS : TS
{
}
摘要数组class:
[System.Xml.Serialization.XmlElementAttribute("high", typeof(IVXB_TS))]
[System.Xml.Serialization.XmlElementAttribute("low", typeof(IVXB_TS))]
public QTY[] Items
嗯Json.NET 7.0.1 Beta 3 实际上能够处理所有这些情况。
关键要点是反序列化器必须像序列化一样配置为类型处理。我错误地认为 json 文件中可用的类型信息将被自动使用。
可能是早期版本也会做同样的事情。