![](/img/trans.png)
[英]Json.Net JsonConvert.SerializeObject json not correct
[英]json.net using JsonConvert.SerializeObject adds a comment to output
如何删除创建的json字符串底部的注释?
我正在尝试使用Json.net将xml转换为json。 具体来说,我是从Zillow API获取数据的,该API返回XML,我需要将其作为json字符串传递到Web浏览器。 多亏了在此站点上找到的问题/答案,我才能够在c#页面中使用json.net进行转换,但是...
我使用以下内容将xml转换为json:
public String GetJson(XmlDocument xml)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(xml);
}
我成功获取了json格式的String,但是此注释已添加到json的底部(似乎是时间戳记)。
{
... json-formatted output...
/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}
我已经检查了原始的xml以确认注释不存在,因此我得出结论说它是由json.net添加的。 我已经在这个网站(和Google)上搜索了有关此信息,但是我找不到合适的搜索标记来找到对此评论的任何提及。
谢谢!
序列化XmlDocument
时,Json.NET不可能插入硬编码的注释 XmlNodeConverter
根本没有任何逻辑可以做到这XmlNodeConverter
。 XmlNodeConverter
唯一要写注释的时间是,如果在XML DOM层次结构中实际上遇到了XmlNodeType.Comment
类型的XML节点,则在源代码的第1502行处:
case XmlNodeType.Comment:
if (writePropertyName)
{
writer.WriteComment(node.Value);
}
break;
因此,仅有几种方法可以将这样的注释字符串添加到您的JSON输出中,包括:
Zillow API或您自己的应用程序在其代码堆栈中的某些地方,实际上可能在XML中添加了注释 。 例如,给定以下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
版本,该版本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
的定制版本。
示例小提琴演示了前两种可能性。
如果您的XML中确实有注释节点,则可以按照如何从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);
}
样品提琴 。
如果您使用自己的自定义版本的Json.NET,则需要调查并修复发生这种情况的原因。
如果因任何原因,你不能修改传入XmlDocument
(或不能修复Json.NET的定制版本),你可以继承JsonTextWriter
和覆盖WriteComment
(也可能是WriteCommentAsync
虽然我们在这里不会需要),并让他们做什么:
public class NoCommentJsonTextWriter : JsonTextWriter
{
public NoCommentJsonTextWriter(TextWriter writer)
: base(writer)
{
}
public override void WriteComment(string text)
{
}
}
然后按以下方式使用它:
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();
}
样品提琴 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.