防止JAXB将String转换为Number(JSON)

时间:2014-07-07 18:52:06

标签: java json spring jaxb formatting

我正在使用JAXB注释来创建我的JSON对象。另外我使用的是Spring 3.2.4。 我遇到的问题是我有一个属性" String anId;"指定为@XmlElement。如果此属性包含类似于" 123.0"的值,则返回给我的结果JSON为:

    {"anId":123}

与我想要的相反

    {"anId":"123.0"}

.0很有意义,我无法将其舍入/截断。我尝试通过执行以下操作来解决此问题:

    @XmlJavaTypeAdapter annotation with an XmlAdapter of <String,String>
    adding @XmlSchemaType(name="string")
    @XmlElement(name="anId",type=String.class)

然而,这些都没有解决问题。注意:将ID指定为String的原因是因为&#34; 1234&#34;是有效的,&#34; 1234.0&#34;是有效的,&#34; abc123&#34;也是ID的潜在有效值。

考虑到这一点,有没有人知道如何解决我的问题?或者至少可以解释为什么它会使数字四舍五入?

编辑:此外,如果我将值更新为8位数字(12345678.0),则返回字符串&#34; 12345678.0&#34;。另外,如果我将值更新为以.00结尾,则将完整数字作为字符串返回&#34; 123.00&#34;。我不知道这是否有帮助,但是由于舍入不一致,这使我的问题更加困惑。

编辑2:问题似乎是由于我使用Jettison作为JSON转换器。切换到杰克逊解决了这个问题。

2 个答案:

答案 0 :(得分:0)

JAXB (JSR-222)规范本身不包含JSON绑定。有:

  1. 将其作为扩展提供的实现(即EclipseLink MOXy,例如:http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html
  2. 支持JAXB注释的JSON绑定库(即Jackson,Genson等)
  3. 将JSON转换为StAX事件/从StAX事件中转出JSON的库(即Jettinson&amp; StAXON),以便可以使用XML绑定库生成消耗JSON(例如:http://bdoughan.blogspot.com/2011/04/jaxb-and-json-via-jettison.html)。
  4. 我假设你属于第三种情况。您看到的行为是因为这些库只接收角色事件。这意味着他们只需获取String 123.0,并需要选择如何在JSON中呈现它。由于他们没有其他选择,他们使用他们认为最好的JSON格式来渲染它。

    最终解决方案需要确认上述哪种情况反映了您的情况。前两个选项将能够解决您的使用案例。

答案 1 :(得分:0)

您是否尝试过使用@XmlAttribute而不是@XmlElement?

另外,您是否使用访问者类型注释了类,即@XmlAccessorType(XmlAccessType.FIELD)?

我倾向于发现使用带有xmlattribute的字段类型我没有问题。