强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或布尔值
本文关键字:整数 布尔值 序列化 JsonConvert SerializeXmlNode 节点 强制 | 更新日期: 2023-09-27 18:30:16
Newtonsoft.Json.JsonConvert
中的SerializeXmlNode
函数始终在序列化过程中将 XML 的最后一个子节点的值作为字符串类型输出,有时您可能需要将它们序列化为整数或布尔值。
示例代码:
<Object>
<ID>12</ID>
<Title>mytitle</Title>
<Visible>false</Visible>
</Object>
输出:
{ "ID" : "12",
"Title" : "mytitle",
"Visible" : "false"
}
期望输出:
{ "ID" : 12,
"Title" : "mytitle",
"Visible" : false
}
有没有办法强制将 XML 节点序列化为整数或布尔值?
谢谢。
注意:当XML已经序列化为JSON字符串时,请避免发布解决方法,因为这些解决方法是我们愿意避免的。
XML序列化的工具。它的 XML 节点序列化旨在提供 XML 和 JSON 之间的一对一对应关系。由于 XML 中的属性只能是字符串类型,因此在序列化过程中不会保留类型信息。反序列化回 JSON 时将毫无用处。
如果您需要将XML转换为JSON,我建议使用同时支持XML和JSON序列化的DTO类。
[XmlRoot ("Object"), JsonObject]
public class Root
{
[XmlElement, JsonProperty]
public int Id { get; set; }
[XmlElement, JsonProperty]
public string Title { get; set; }
[XmlElement, JsonProperty]
public bool Visible { get; set; }
}
从 XML 反序列化,然后序列化为 JSON:
public class Program
{
private const string xml = @"
<Object>
<Id>12</Id>
<Title>mytitle</Title>
<Visible>false</Visible>
</Object>";
private static void Main ()
{
var serializer = new XmlSerializer(typeof(Root));
var root = (Root)serializer.Deserialize(new StringReader(xml));
Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
Console.ReadKey();
}
}
输出:
{
"Id": 12,
"Title": "mytitle",
"Visible": false
}
当前的 JSON.NET 版本不提供请求的功能,因此我修改了源代码以提供此功能:
https://github.com/lukegothic/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
此修改为 XmlNodeConverter 提供了一种从 XML 节点读取名为"Type"的可选属性的方法,该属性保存节点值的所需序列化。默认情况下,转换器将所有值序列化为结果 JSON 字符串中的字符串,但现在您可以添加一个属性来指定所需的 DataType 输出。允许的类型包括整数、浮点型、布尔值和日期。
例如,如果您有以下源 XML:
<Object>
<ID json:Type='Integer'>12</ID>
<Title>mytitle</Title>
<Visible json:Type='Boolean'>false</Visible>
<Price json:Type='Float'>1.55</Price>
<ExpirationDate json:Type='Date'>2013-12-31</ExpirationDate>
</Object>
它将被序列化为:
{
"ID":12,
"Title":"mytitle",
"Visible":false,
"Price":1.55,
"ExpirationDate":"2013-12-31T00:00:00"
}