XmlSerialization 属性で装飾された POCO との間で Json を読み書きする必要があります。この POCO は XSD から生成されています。ポリモーフィズム、継承、オブジェクト、オブジェクトの配列、および抽象クラスの配列を広範に使用します。私はすでに非常に有望に見えるJsonFx V2を試しましたが、残念ながらこれはうまく機能しておらず、このオープン ソース プロジェクトでは数年間ほとんど活動がありません。
どんな助けでも感謝します。
更新 1 : 私の知る限り、Json.NET は XmlSerialization 属性を処理する方法を知りません。
更新 2 : ServiceStack V3 は機能しているようですが、少なくとも 1 つの問題があります。
プロパティが object 型の場合は _type メンバーが追加されますが、これで問題ありません。しかし、オブジェクトの配列にはそのような情報はありません。
次の 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[]) に adxppostalCode のインスタンスが含まれている場合、シリアル化時に Json に型情報が格納されません。その結果、adxppostalCode のインスタンスではなく、ADXP クラスのインスタンスがデシリアライズ時に配列に追加されます。
これが構成の問題にすぎないことを願っています。この動作以外はうまく機能しているためです。
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