当前位置: 首页 > 面试题库 >

强制JsonConvert.SerializeXmlNode将节点值序列化为Integer或Boolean

翟俊远
2023-03-14
问题内容

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

样例代码:

<Object>
  <ID>12</ID>
  <Title>mytitle</Title>
  <Visible>false</Visible>
</Object>

输出:

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

所需的输出:

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

有没有一种方法可以强制将XML节点序列化为Integer或Boolean?

谢谢。

注意:当XML已被序列化为JSON字符串时,请避免发布解决方法,因为这些解决方法是我们愿意避免的。


问题答案:

当前的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"
}


 类似资料:
  • 问题内容: 我有一个类,它是一个内部列表周围的装饰器。我想在我的JAX-RS服务中将此类用作DTO。其代码如下: 我需要同时支持application / xml和application / json。格式是固定的,必须像 …以XML格式,以及 …在JSON中。XML可以很好地工作,但是JSON看起来像这样: 您可能会怀疑,如果我不实现List接口,它将生成我需要的格式。因此,我认为序列化器很聪明

  • 我有一个班级,它是一个装饰围绕一个内部列表。我想在我的JAX-RS服务中使用这个类作为DTO。其代码如下: 我需要同时支持application/xml和application/json。格式是固定的,它必须像 ...XML格式,并且 ...在JSON中。XML工作得非常好,但JSON看起来是这样的: 正如您可能怀疑的那样,如果我不实现列表接口,它会生成我需要的格式。所以我想序列化器是聪明的,将其

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,

  • 我试图创建一个函数,如果x和y是整数,则返回x和y之间的随机整数,但如果x或y是双精度的,则该函数返回x和y之间的双精度。但当我尝试使用整数时,它引发了一个异常:“类java.lang.integer不能转换为类java.lang.double(java.lang.integer和java.lang.double位于加载程序“引导程序”的模块java.base中)”“如何修复它?

  • 我正在使用Jackson XML 2.8.9,不幸的是,我找不到任何方法将空/空集合序列化为空节点。 负责序列化为XML的方法: 我尝试使用: > 序列化提供程序: Jackson 2.9.0 EMPTY_ELEMENT_AS_NULL功能: 不幸的是,什么都不管用。有人知道如何实现它吗? 试验方法: ReportView类: 我用示例代码准备了一个存储库:https://github.com/a