C#中XML转JSON:如何使decimal节点值不带引号输出
解决XML转JSON时decimal节点保留数值类型的问题
方法1:修改XML节点添加类型属性(原生支持,推荐)
Newtonsoft.Json的SerializeXmlNode支持通过XML的xsi:type属性识别数据类型,你需要给<decimal>节点添加类型声明并引入对应命名空间:
修改后的XML:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <decimal xsi:type="xsd:decimal">12.55</decimal> <string>Test</string> </root>
使用原代码转换即可得到预期结果:
var result = JsonConvert.SerializeXmlNode(Doc, Newtonsoft.Json.Formatting.Indented, true);
输出的JSON:
{ "decimal": 12.55, "string": "Test" }
方法2:序列化后手动修正JSON类型(无需修改原始XML)
如果无法修改XML结构,可以先序列化得到JSON字符串,再解析为JObject手动转换字段类型:
// 1. 初始序列化得到带字符串类型的JSON string rawJson = JsonConvert.SerializeXmlNode(Doc, Newtonsoft.Json.Formatting.Indented, true); JObject jsonObj = JObject.Parse(rawJson); // 2. 转换decimal字段为数值类型 if (jsonObj.TryGetValue("decimal", out JToken decimalToken) && decimalToken.Type == JTokenType.String) { if (decimal.TryParse(decimalToken.ToString(), out decimal decValue)) { jsonObj["decimal"] = decValue; } } // 3. 输出最终JSON string finalJson = jsonObj.ToString(Newtonsoft.Json.Formatting.Indented);
方法3:自定义XmlNodeConverter(批量处理场景)
如果需要批量处理大量同结构XML,可以自定义转换器,自动识别指定节点并转换类型:
public class CustomXmlConverter : XmlNodeConverter { protected override void WriteElementContent(JsonWriter writer, XmlNode node) { // 识别decimal节点并转换为数值类型 if (node.Name.Equals("decimal", StringComparison.OrdinalIgnoreCase) && decimal.TryParse(node.InnerText, out decimal value)) { writer.WriteValue(value); return; } // 其他节点按默认逻辑处理 base.WriteElementContent(writer, node); } }
使用方式:
var settings = new JsonSerializerSettings { Formatting = Newtonsoft.Json.Formatting.Indented, Converters = new List<JsonConverter> { new CustomXmlConverter() } }; string finalJson = JsonConvert.SerializeObject(Doc, settings);
内容的提问来源于stack exchange,提问作者BenjaminR
相关产品推荐
相关产品推荐

