我正在使用以下方法从 XML 转换为 JSONSerializeXmlNode
。看起来预期的行为是将所有 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"
}
是的,为了制定更通用的解决方案,您必须编写自己的转换器。事实上,调用时发生的 XML 到 JSON 转换SerializeXmlNode
是使用一个完成的XmlNodeConverter
随 Json.Net 一起提供。这个转换器本身似乎不太可扩展,但你总是可以使用它源代码作为创建自己的起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)