gpt4 book ai didi

c# - Json.NET,可以扩展SerializeXmlNode来检测数字吗?

转载 作者:行者123 更新时间:2023-11-30 16:12:34 25 4
gpt4 key购买 nike

我正在使用 SerializeXmlNode 从 XML 转换为 JSON。看起来预期的行为是将所有 XML 值转换为字符串,但我想在适当的地方发出真实的数值。

// Input:   <Type>1</Type>
string json = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented, true);
// Output: "Type": "1"
// Desired: "Type": 1

我是否需要编写一个自定义转换器来执行此操作,或者是否有一种方法可以通过委托(delegate)在适当的点连接到序列化过程?或者,我必须编写自己的自定义 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作为创建您自己的起点。

关于c# - Json.NET,可以扩展SerializeXmlNode来检测数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22770871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com