2015-05-19 28 views
2

我需要讀/寫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 
+1

這些類型的問題都是關於SO的話題。無論如何,看看[Json.NET](http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm) –

+0

@YuvalItzchakov更新了我的問題。 –

+0

你在說什麼屬性? ServiceStack支持DataContract/DataMember屬性。 JSON.NET有它自己的屬性。 –

回答

0

好Json.NET 7.0.1 Beta 3的其實是能夠處理所有這些情況。

關鍵問題是解串器必須配置爲類型處理,因爲它是用於序列化的。我錯誤地認爲json文件中可用的類型信息會被自動使用。

可能是早期版本會做同樣的事情。

相關問題