当序列化一个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