Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制JsonConvert.SerializeXmlNode将节点值序列化为整数或布尔值_C#_Json_Json.net - Fatal编程技术网

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

C# 强制JsonConvert.SerializeXmlNode将节点值序列化为整数或布尔值,c#,json,json.net,C#,Json,Json.net,Newtonsoft.Json.JsonConvert类中的SerializeXmlNode函数在序列化过程中始终以字符串类型输出XML最后一个子节点的值,有时可能需要将它们序列化为整数或布尔值 示例代码: 12 我的头衔 假的 输出: { "Id": 12, "Title": "mytitle", "Visible": false } {“ID”:“12”, “标题”:“我的标题”, “可见”:“假” } 期望输出: {“ID”:12, “标题”:“我的标题”, “可见”:

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

示例代码:


12
我的头衔
假的
输出:

{
  "Id": 12,
  "Title": "mytitle",
  "Visible": false
}
{“ID”:“12”,
“标题”:“我的标题”,
“可见”:“假”
}
期望输出:

{“ID”:12,
“标题”:“我的标题”,
“可见”:错误
}
有没有办法强制将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 = @"
        <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();
    }
}

当前的JSON.NET构建没有提供请求的功能,因此我修改了源代码以提供此功能:

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

例如,如果您有以下源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>

这是一个很好的解决办法,但这不是问题的重点。我的问题是,JSON.NET是否提供了一种方法来指定XML节点应序列化为不同于字符串的JS数据类型。在API文档中,有一种方法可以强制将节点呈现为JS数组,方法是向要以这种方式序列化的XML节点添加属性。我想知道是否有类似的方法可以强制将节点序列化为所需的数据类型。不,没有方法。解释“为什么”在第一段。这里的代码:正如您所看到的,值总是字符串。没有其他转换器能够理解XML节点的深层结构。查看您提供的源代码,修改代码以满足我们的需要看起来并不难。如果有人想将请求的功能添加到他们的fork中,我将修改类并在此处发布更改。您的解决方案很好。我想知道JSON.NET是否考虑采用您的解决方案?很遗憾,但我没有从他们那里得到任何反馈以实现此功能。跟踪问题:,从2019年10月开始。
{
    "ID":12,
    "Title":"mytitle",
    "Visible":false,
    "Price":1.55,
    "ExpirationDate":"2013-12-31T00:00:00"
}