是否有一个Json库可以同时处理对象数组和抽象类数组?



我需要从/到使用XmlSerialization属性装饰的POCO读/写Json。这个POCO是从XSD生成的。它广泛使用了多态性、继承、对象、对象数组和抽象类数组。我已经尝试过JsonFx V2,看起来很有前途,但不幸的是,它工作得不好,而且这个开源项目已经好几年没有任何活动了。

感谢您的帮助。

更新1: AFAIK Json。. NET不知道如何处理XmlSerialization属性。

更新2: ServiceStack V3似乎可以完成这项工作,但我至少有一个问题。

当属性为object类型时添加_type成员,这是可以的。但是对于object的数组没有这样的信息。

考虑以下c#类:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(adxppostalCode))]
public partial class ADXP : ST
{
  ...
}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "adxp.postalCode"]
public partial class adxppostalCode : ADXP
{
}

如果object (object[])数组包含adxppostalCode的实例,则在序列化时Json中没有类型信息。因此,它在反序列化时将类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"
                ]
              }
            ]

对于抽象类的数组,在输出中写入正确的类型。在反序列化时,它试图创建抽象基类型的实例,但失败了。例如:

Json片段:

"Items": [
          {
            "$type": "IVXB_TS, ...",
            "inclusive": true,
            "value": "20091231"
          }
        ]

无法创建QTY类型的实例。类型是接口或抽象类,不能实例化。

类层次结构:

[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
{
}

抽象类数组:

[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文件中可用的类型信息将被自动使用。

最新更新