【问题标题】:Binding a JSON to a Java class using JAXB使用 JAXB 将 JSON 绑定到 Java 类
【发布时间】:2009-08-11 16:47:52
【问题描述】:

我有以下 JSON,可以是真也可以是假:

{"flag1":<boolean value>, "flag2":<boolean value>}

我尝试使用 Jersey 和以下 JAXB 注释将其绑定到 Java 类:

@XmlRootElement
public class MyClass {
    @XmlElement(name = "flag1", type = Boolean.class)
    private Boolean flag1;
    @XmlElement(name = "flag2", type = Boolean.class)
    private Boolean flag2;

    ...
}

问题在于,当我将非布尔值分配给“flag1”或“flag2”时,如下例所示,JAXB 会自动为 MyClass 的“flag1”和“flag2”字段分配一个 false 值。

{"flag1":"foo", "flag2":"bar"}

有没有办法注释“MyClass”,以便当 JSON 的“flag1”和“flag2”不是布尔值时,我会得到一个异常?

【问题讨论】:

  • JAXB 现在支持 JSON 了吗?还是您在使用第三方库?
  • 我正在使用泽西岛。 jersey.dev.java.net
  • 我认为 Jersey 使用了 JAXB 注释,但有自己的运行时。
  • 你能提供一个替代的 getter/setter 吗?
  • 不...我之前发布的解决方案(请参阅修订历史记录)不起作用。它只适用于这样的 json:“flag”:“true”,但对于这样的 json 会失败:“flag1”:true(Jersey 抛出了一个解组异常)。我接受了您的回答,因为您找到了注释不起作用的原因。

标签: java json jaxb jersey


【解决方案1】:

看起来 Jersey 只是使用 Boolean.valueOf,它将文字“真”以外的所有内容都视为假。由于 JavaScript 没有变量类型的概念,这可以说是一种有效的行为。

相比之下,XML 映射是基于模式定义的,它确实有一个非常具体的布尔值概念。


没有使用 Jersey(或自 1.x 天以来的 JAXB),我想知道您是否必须注释实际变量,或者是否可以注释设置器。或者,也许您可​​以提供一个接受 String 并解析它的 setter,而不是 / 以及接受 boolean 的 setter。

【讨论】:

    【解决方案2】:

    如果您使用纯 Jackson JAX-RS 提供程序,您展示的内容将按照您想要的方式工作(抛出异常)。它确实接受一些变体(1 和 0,因为某些语言没有原生布尔类型),但不接受没有有意义的等价物。

    或者,如建议的那样,使用 String 类型的 setter 方法会很有意义,因为那时您可以手动控制转换。

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多