JAXB删除XmlRootElement包装器

Tho*_*Kao 5 xml json jaxb marshalling jaxb2

我有这个@XmlRootElement类Person.

    @XmlRootElement
    class Person {
        private String desc;
    }
Run Code Online (Sandbox Code Playgroud)

并且返回内容是

    {"Person": {"desc": "abc"} }
Run Code Online (Sandbox Code Playgroud)

我真的不想要root包装器,所以我希望内容看起来像

    {"desc": "abc"}
Run Code Online (Sandbox Code Playgroud)

我可以通过JaxB实现这一目标吗?如果是这样,怎么样?谢谢!

jes*_*ale 3

JAXB 是 XML 的 API,而不是 JSON。

然而,有一些 JSON 库(至少 Jackson)可以利用 JAXB 注释。我不知道您使用的是哪一种,所以我不知道如何提供最好的帮助。(如果您将其与 Jersey 框架一起使用,它会使用 Jackson 进行 JSON 序列化。)您将需要配置您正在使用的任何 JSON 库,以便能够配置 JSON 输出中根元素的“包装”。

我编写了这个快速 Groovy 脚本来在 Jackson 中进行测试:

@Grab('com.fasterxml.jackson.core:jackson-databind:2.2.2')
import javax.xml.bind.annotation.XmlRootElement
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature

@XmlRootElement
public class Person {
  public String desc = "howdy"
}

Person p = new Person()
ObjectMapper om = new ObjectMapper().enable(SerializationFeature.WRAP_ROOT_VALUE)
println om.writeValueAsString(p)
Run Code Online (Sandbox Code Playgroud)

正如上面所写,它输出 JSON:

{"Person":{"desc":"howdy"}}
Run Code Online (Sandbox Code Playgroud)

如果你取出该部分,.enable(SerializationFeature.WRAP_ROOT_VALUE)它会给你:

{"desc":"howdy"}
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用 Jackson,则看起来后台使用的 ObjectMapper 已被设置为WRAP_ROOT_VALUE,您只需将其关闭即可。