當序列化一個XmlDocument
時,Json.NET將無法插入一個硬編碼的comment - 在XmlNodeConverter
中根本沒有任何邏輯來做到這一點。唯一的一次XmlNodeConverter
會寫一個評論是,如果XmlNodeType.Comment
類型的XML節點是在XML DOM層次結構在源代碼中實際遇到,大約行1502:
case XmlNodeType.Comment:
if (writePropertyName)
{
writer.WriteComment(node.Value);
}
break;
因此,只有幾種方法這樣的註釋字符串本來可以添加到您的JSON輸出,包括:
有可能實際上是在你的XML comments,由Zillow的API或通過自己的應用程序都在其代碼堆棧增加。例如,考慮以下XML:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<childNode>
<innerChildNode>Some Text</innerChildNode>
</childNode>
<!-- H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda -->
</root>
<!-- H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda -->
Json.NET會生成以下JSON:
{
"?xml": {
"@version": "1.0",
"@encoding": "utf-8"
},
"root": {
"childNode": {
"innerChildNode": "Some Text"
}/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}
某處在你的代碼堆棧,你的應用程序可能會在JsonConvert.DefaultSettings
已經安裝了自己的XmlNodeConverter
版本將註釋插入到輸出中。例如,考慮以下全局轉換器:
JsonConvert.DefaultSettings =() => new JsonSerializerSettings
{
Converters = { new FixedXmlNodeConverter() },
};
public class FixedXmlNodeConverter : Newtonsoft.Json.Converters.XmlNodeConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
base.WriteJson(writer, value, serializer);
writer.WriteComment("Global Comment: H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda");
}
}
的JSON產生將包含額外的評論:
{
"?xml": {
"@version": "1.0",
"@encoding": "utf-8"
},
"root": {
"childNode": {
"innerChildNode": "Some Text"
}/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}/*Global Comment: H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda*/
你可能在使用Json.NET你自己的自定義生成與XmlNodeConverter
定製版。
樣本fiddle展示了前兩種可能性。
如果你確實有註釋節點在你的XML,你可以按照How to remove all comment tags from XmlDocument的建議之一或任意數量的類似的問題帶他們。如果安裝了全局轉換器,則可以通過手動分配XmlNodeConverter
並將其傳遞到JsonConvert.SerializeObject()
來取代它。
爲了處理這兩種情況下,你可能GetJson()
成爲:
public String GetJson(XmlDocument xml)
{
XmlNodeList list = xml.SelectNodes("//comment()");
foreach(XmlNode node in list)
{
node.ParentNode.RemoveChild(node);
}
var converter = new Newtonsoft.Json.Converters.XmlNodeConverter();
// Use Newtonsoft.Json.Formatting.None in your production code
return Newtonsoft.Json.JsonConvert.SerializeObject(xml, Newtonsoft.Json.Formatting.Indented, converter);
}
樣品fiddle。
如果您使用自己的Json.NET自定義構建,則需要調查並解決這種情況發生的原因。
如果因任何原因,你不能修改傳入XmlDocument
(或不能修復Json.NET的定製版本),你可以繼承JsonTextWriter
和覆蓋WriteComment
(也可能是WriteCommentAsync
雖然我們在這裏不會需要),並讓他們做什麼:
public String GetJson(XmlDocument xml)
{
var sb = new StringBuilder();
using (var textWriter = new StringWriter(sb))
// Use Newtonsoft.Json.Formatting.None in your production code
using (var writer = new NoCommentJsonTextWriter(textWriter) { Formatting = Newtonsoft.Json.Formatting.Indented })
{
JsonSerializer.CreateDefault().Serialize(writer, xml);
}
return sb.ToString();
}
樣品fiddle:
public class NoCommentJsonTextWriter : JsonTextWriter
{
public NoCommentJsonTextWriter(TextWriter writer)
: base(writer)
{
}
public override void WriteComment(string text)
{
}
}
如下然後使用它。
來源
2017-05-02 17:37:32
dbc
我們需要一個[mcve]來展示如何獲得XML以及它的字符串值是什麼。 – dbc