我需要讀/寫JSON從/到一個用XmlSerialization屬性裝飾的POCO。此POCO已從XSD生成。它廣泛使用多態,繼承,對象,對象數組和抽象類數組。我已經試過JsonFx V2,看起來非常有希望,但不幸的是這種方式運行不好,幾年來在這個開源項目上幾乎沒有任何活動。是否有一個Json庫與對象數組和抽象類數組一起工作?
任何幫助表示讚賞。
更新1:AFAIK Json.NET不知道如何處理XmlSerialization屬性。
更新2:ServiceStack V3似乎做的工作,但我至少有一個問題。
當屬性的類型爲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
{
}
如果對象的陣列(對象[])包含adxppostalCode的實例有把在JSON在沒有類型信息序列化。因此,它在反序列化過程中將類ADXP的實例添加到數組,而不是adxppostalCode的實例。
我希望這只是一個配置問題,因爲除了這種行爲,它運行良好。 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"
}
]
無法創建類型數量的實例。 Type是一個接口或抽象類,不能實例化。
類層次結構:
[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
這些類型的問題都是關於SO的話題。無論如何,看看[Json.NET](http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm) –
@YuvalItzchakov更新了我的問題。 –
你在說什麼屬性? ServiceStack支持DataContract/DataMember屬性。 JSON.NET有它自己的屬性。 –