9

类中的SerializeXmlNode函数Newtonsoft.Json.JsonConvert在序列化过程中始终将 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 字符串时,请避免发布解决方法,因为这些解决方法是我们愿意避免的。

4

2 回答 2

9

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 = @"
        <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
}
于 2013-09-04T15:58:31.557 回答
6

当前的 JSON.NET 版本不提供请求的功能,因此我修改了源代码以提供此功能:

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

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

例如,如果您有这个源 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"
}
于 2013-09-11T09:33:03.193 回答