我有这个@XmlRootElement类的人。
@XmlRootElement
class Person {
private String desc;
}
返回内容是
{"Person": {"desc": "abc"} }
我真的不想要根包装,所以我希望内容看起来像
{"desc": "abc"}
我可以通过JaxB完成这个任务吗?如果是这样的话,是怎么做的?谢谢!
发布于 2013-08-24 09:34:55
JAXB是XML的API,而不是JSON。
但是,有一些JSON库(至少Jackson)可以利用JAXB注释。我不知道你用的是哪一种,所以我不知道怎样才能最好地帮助你。(如果您将其与泽西框架一起使用,它将使用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)
正如上面所写的,它输出JSON:
{"Person":{"desc":"howdy"}}
如果你去掉.enable(SerializationFeature.WRAP_ROOT_VALUE)
这个部分,它给你的是:
{"desc":"howdy"}
因此,如果您使用的是杰克逊,它看起来就像在幕后使用的ObjectMapper被设置为WRAP_ROOT_VALUE
,您只需要关闭它。
发布于 2013-08-26 05:14:56
备注:,我是EclipseLink JAXB (MOXy)的负责人,也是JAXB (JSR-222)专家组的成员。
作为answered by esseplymale,JAXB (JSR-222)涵盖的是XML,而不是JSON绑定。然而JAXB经常被直接使用( JAXB与类似的Jettison一起使用,用于将JSON转换为/从StAX事件,请参阅:http://blog.bdoughan.com/2011/04/jaxb-and-json-via-jettison.html)和间接使用(JSON绑定实现解释JAXB注释的子集)。
下面是如何通过利用EclipseLink MOXy作为您的JAXB提供者来完成您的用例。
Java模型
Person
下面是您问题中的Person
类。我添加了@XmlAccessorType(XmlAccessType.FIELD)
注释,以避免添加访问器方法(请参阅:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html)。
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Person {
private String desc;
}
jaxb.properties
使用MOXy作为JAXB提供程序,需要在与域模型相同的包中包含一个名为jaxb.properties
的文件,其中包含以下条目(参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示代码
Demo
在演示代码中有一些需要注意的事项:
JAXBContextProperties.MEDIA_TYPE
属性用于将MOXy置于JSON绑定模式中。JAXBContextProperties.JSON_INCLUDE_ROOT
属性用于告诉MOXy省略根元素。unmarshal
方法之一来告诉Class
是什么类型。import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource("src/forum18417466/input.json");
Person person = unmarshaller.unmarshal(json, Person.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
input.json/Output
{
"desc" : "abc"
}
https://stackoverflow.com/questions/18417466
复制