CodeGo.net> Json.NET,可以扩展SerializeXmlNode以检测数字吗?
作者:互联网
我正在使用SerializeXmlNode从XML转换为JSON.看起来预期的行为是将所有XML值转换为字符串,但是我想在适当的地方发出真实的数字值.
// Input: <Type>1</Type>
string json = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented, true);
// Output: "Type": "1"
// Desired: "Type": 1
我是否需要编写一个自定义转换器来执行此操作,或者是否有办法通过委托在适当的位置加入序列化过程?或者,是否必须编写自己的自定义JsonConverter类来管理过渡?
正则表达式哈克
鉴于适当解决方案的复杂性,这是另一种解决方案(我并不完全为此感到骄傲,但它确实有效…).
// Convert to JSON, and remove quotes around numbers
string json = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented, true);
// HACK to force integers as numbers, not strings.
Regex rgx = new Regex("\"(\\d+)\"");
json = rgx.Replace(json, "$1");
解决方法:
XML无法像JSON一样区分原始类型.因此,当直接将XML转换为JSON时,Json.Net不知道值应该是什么类型,这简直就是猜测.如果始终假定仅由数字组成的值是序数,则邮政编码和邮政编码前加零的电话号码之类的内容将在转换中受到干扰.因此,Json.Net走上安全之路并将所有值都视为字符串就不足为奇了.
解决此问题的一种方法是将XML反序列化为中间对象,然后将其序列化为JSON.由于中间对象具有强类型化的属性,因此Json.Net知道要输出什么.这是一个例子:
class Program
{
static void Main(string[] args)
{
string xml = @"<root><ordinal>1</ordinal><postal>02345</postal></root>";
XmlSerializer xs = new XmlSerializer(typeof(Intermediary));
using (TextReader reader = new StringReader(xml))
{
Intermediary obj = (Intermediary)xs.Deserialize(reader);
string json = JsonConvert.SerializeObject(obj , Formatting.Indented);
Console.WriteLine(json);
}
}
}
[XmlRoot("root")]
public class Intermediary
{
public int ordinal { get; set; }
public string postal { get; set; }
}
以上输出:
{
"ordinal": 1,
"postal": "02345"
}
是的,要制作更通用的解决方案,您必须编写自己的转换器.实际上,调用SerializeXmlNode时发生的XML到JSON的转换是使用Json.Net附带的XmlNodeConverter完成的.该转换器本身似乎不是很可扩展,但是您始终可以将其source code用作创建自己的转换器的起点.
标签:json-net,c 来源: https://codeday.me/bug/20191121/2055414.html