2014-06-23 52 views
3

release notes爲Json.NET 6.0發行3個狀態如何獲得Json.NET空XML元素序列化到空字符串

變化 - 空白XML元素將被寫成一個空字符串,而不是空

但這不是我的經驗。

var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1""> 
        <empty/> 
        <space> </space> 
        <null xsi:nil=""true""/> 
       </document>"; 
var doc = new XmlDocument(); 
doc.LoadXml(xmlText); 
var jsonText = JsonConvert.SerializeXmlNode(doc); 

我預計

"empty":"", "space":" ", "null":{"@xsi:nil":"true"} 

,但得到

"empty":null, "space":"", "null":{"@xsi:nil":"true"} 

失落的空間是沒有問題的,但現在我真的很喜歡空的XML元素序列化爲「」,而不是空。這可能嗎?

回答

5

你會得到你想要的東西,如果你寫的XML的格式如下:

var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1""> 
       <empty></empty> 
       <space> </space> 
       <null xsi:nil=""true""/> 
      </document>"; 

正如你可以看到你想要爲空字符串寫爲<empty></empty>,而不是<empty />要序列化的節點。

的事情是,JSON.NET,用於序列化XML節點到JSON,採用XmlNodeConverter類在其SerializeNode方法檢查XmlElement類的IsEmpty屬性。你可以閱讀更多關於此屬性here。該決定null或空的字符串是否被序列化時,上述方法的代碼段看起來是這樣的:

if (element.IsEmpty) 
    writer.WriteNull(); 
else 
    writer.WriteValue(string.Empty); 

當XML片段是自閉(<empty/>),該IsEmpty屬性返回true,零被寫入json字符串,否則(<empty></empty>),它返回false,string.empty寫入json字符串。

UPDATE 1:

此更新應該解決的問題中描述here。 (鏈接也可以在這個答案的評論中找到)。

爲了能夠序列不具有價值<empty></empty>代替<empty/>一個屬性,我們應該執行自定義XML序列化,所以Serializetest類(在上面的鏈接提供)應該是這樣的:

[Serializable] 
public class Serializetest : IXmlSerializable 
{ 
    public Serializetest() 
    { 
     Empty = string.Empty; 
    } 

    public string Empty { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement("Empty"); 
     writer.WriteValue(Empty); 
     writer.WriteEndElement(); 
    } 
} 

然後主要方法:

var serializetest = new Serializetest(); 
string xmlText; 

var serializer = new XmlSerializer(typeof(Serializetest)); 
using (var textWriter = new StringWriter()) 
{ 
    using (var xmlWriter = XmlWriter.Create(textWriter)) 
    { 
     serializer.Serialize(xmlWriter, serializetest); 
    } 

    xmlText = textWriter.ToString(); 
} 

var doc = new XmlDocument(); 
doc.LoadXml(xmlText); 
var jsonText = JsonConvert.SerializeXmlNode(doc); 

var json = JObject.Parse(jsonText); 
var empty = (string)json.SelectToken("Serializetest.Empty"); 
// This should return empty string instead of null. 
+0

我敢肯定標準的.NET XML序列化的一個空字符串屬性產生但我要回去,明天上。 –

+0

是的,但您可以重寫XML序列化以使其與JSON.NET結合使用。 –

+0

代碼中描述的問題。 https://gist.github.com/jonelf/47e3a1b2f06b66983e29 –

相關問題