强制JsonConvert.SerializeXmlNode将节点值序列化为整数或布尔值

Newtonsoft.Json.JsonConvert类的SerializeXmlNode函数始终在序列化过程中将XML的最后一个子节点的值作为字符串类型输出,有时您可能需要将它们序列化为整数或布尔值。

示例代码:

  12 mytitle false  

输出:

 { "ID" : "12", "Title" : "mytitle", "Visible" : "false" } 

期望的输出:

 { "ID" : 12, "Title" : "mytitle", "Visible" : false } 

有没有办法强制XML节点序列化为整数或布尔值?

谢谢。

注意:当XML已经序列化为JSON字符串时,请避免发布变通办法,因为这些变通办法是我们愿意避免的。

JSON.NET不是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 = @"  12 mytitle false "; 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构建不提供所请求的function,因此我修改了源代码以提供此function:

https://github.com/lukegothic/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs

此修改为XmlNodeConverter提供了一种从名为“Type”的XML节点读取可选属性的方法,该节点保存节点值的所需序列化。 默认情况下,转换器将所有值序列化为结果JSON字符串中的字符串,但现在您可以添加指定所需DataType输出的属性。 允许的类型是Integer,Float,Boolean和Date。

例如,如果您有此源XML:

  12 mytitle false 1.55 2013-12-31  

它将被序列化为:

 { "ID":12, "Title":"mytitle", "Visible":false, "Price":1.55, "ExpirationDate":"2013-12-31T00:00:00" }