我正在尝试将以下有效负载发布到基于泽西岛的Web服务中:
{
"firstname":"Jimmy",
"lastname":"Johns",
"addresses":
[
{
"street":"19 Mayberry Drive",
"city":"Mayberry",
"state":"nc",
"postalcode":"27043",
"country":"us",
"addresstype":1
}
],
"data":
{
"eyes":"blue",
"hair":"brown",
"sandwich":"roast beef"
}
}
我的泽西岛代码:
@POST
public Response create( Person person )
{
createBo( person ); <------- stopped here in debugger
...
就在Jersey打电话给我时,我停了下来,我看到 当面的
地址正好与我要查找的内容(上面的JSON中的内容)完全冲了出来。但是,我的数据元组不存在。我知道Jersey正在为 Address es 调用我的no-
arg构造函数,并且它的setter也被调用了,但是我晚上仍无法解决Jersey可能会或可能不会尝试使用这些随机(“数据”)元组的问题在我的JSON中。(我之所以说“随机”,是因为在不同的调用中,它们可能是“凹”:“深,暗”,“山”:“高,宽”等。这是我的界面的组成部分。)
为了充实我在说的内容,请将这些POJO视为上述内容的上下文:
@XmlAccessorType( XmlAccessType.FIELD )
@XmlRootElement
public class Person implements Serializable
{
@XmlElement
private List< Address > addresses = new ArrayList< Address >();
@XmlElement
private Map< String, String > data = new HashMap< String, String >();
...
@XmlRootElement
public class Address implements Serializable
{
private String street;
private String city;
private String state;
private String country;
private String postalcode;
private Integer addresstype;
...
注意:我不能像完成 地址 一样来做随机元组,因为我实际上事先并不知道键是什么(而我将 地址 限制为 street , city 等)。
我需要的是Jersey的 HashMap 的某种魔术序列化器,我似乎无法很好地解释文档以理解如何编写文档或解决此问题,同时仍保持界面的灵活性。
我将对如何完成此工作表示任何感谢。
拉斯·贝特曼
PS注意:遗憾的是,使用Jersey / JAXB /Jackson将Java.util.Map映射到JSON对象并没有帮助,尽管它显示了很大的希望。
注意: 我是 EclipseLink
JAXB(MOXy)的
负责人,并且是
JAXB(JSR-222) 专家组的成员。
如果您正在使用MOXy,则以下内容将起作用,并且应与任何其他JAXB提供程序一起使用。这种方法转换java.util.Map
成org.w3c.dom.Element
使用XmlAdapter
。
MapAdapter
An
XmlAdapter
允许您将一个类的实例封送为另一个类的实例(请参阅:http : //blog.bdoughan.com/2010/07/xmladapter-jaxbs-
secret-weapon.html)。
package forum11353790;
import java.util.*;
import java.util.Map.Entry;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class MapAdapter extends XmlAdapter<Element, Map<String, String>> {
private DocumentBuilder documentBuilder;
public MapAdapter() throws Exception {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
@Override
public Element marshal(Map<String, String> map) throws Exception {
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("data");
document.appendChild(rootElement);
for(Entry<String,String> entry : map.entrySet()) {
Element childElement = document.createElement(entry.getKey());
childElement.setTextContent(entry.getValue());
rootElement.appendChild(childElement);
}
return rootElement;
}
@Override
public Map<String, String> unmarshal(Element rootElement) throws Exception {
NodeList nodeList = rootElement.getChildNodes();
Map<String,String> map = new HashMap<String, String>(nodeList.getLength());
for(int x=0; x<nodeList.getLength(); x++) {
Node node = nodeList.item(x);
if(node.getNodeType() == Node.ELEMENT_NODE) {
map.put(node.getNodeName(), node.getTextContent());
}
}
return map;
}
}
人
您指定一个字段/属性应XmlAdapter
通过@XmlJavaTypeAdapter
注释利用。
package forum11353790;
import java.io.Serializable;
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType( XmlAccessType.FIELD )
@XmlRootElement
public class Person implements Serializable {
private String firstname;
private String lastname;
private List< Address > addresses = new ArrayList< Address >();
@XmlAnyElement
@XmlJavaTypeAdapter(MapAdapter.class)
private Map< String, String > data = new HashMap< String, String >();
}
地址
package forum11353790;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Address implements Serializable {
private String street;
private String city;
private String state;
private String country;
private String postalcode;
private Integer addresstype;
}
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
演示版
下面是一个独立的示例,您可以运行它来证明一切正常。
package forum11353790;
import java.io.FileInputStream;
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(new FileInputStream("src/forum11353790/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 /输出
{
"firstname" : "Jimmy",
"lastname" : "Johns",
"addresses" : [ {
"street" : "19 Mayberry Drive",
"city" : "Mayberry",
"state" : "nc",
"country" : "us",
"postalcode" : "27043",
"addresstype" : 1
} ],
"data" : {
"sandwich" : "roast beef",
"hair" : "brown",
"eyes" : "blue"
}
}
MOXy和JAX-RS / Jersey
您可以通过利用该类在JAX-RS环境中利用MOXy MOXyJsonProvider
:
问题内容: 我设置了一个Eclipse WebApp项目,并将Jersey和Jackson JAR放在WEB-INF / lib目录中。我想使用JSON序列化,但无法解决此错误: 在 WEB-INF / lib目录 文件夹包含以下JAR: web.xml : Greeting.java : WebApp项目在嵌入式Tomcat v7服务器中运行(在eclipse中查看“服务器”)。 要求 : 只要
我正在尝试将以下有效负载发布到我基于Jersey的web服务: 我的泽西岛代码: 就在Jersey给我打电话的时候,我停下了,我看到了我正在寻找的地址(上面JSON中的内容)。然而,我的数据元组不在那里。我知道Jersey正在为地址es调用我的无参数构造函数,它的setters也在被调用,但是我还没睡,因为Jersey可能会也可能不会尝试对JSON中的这些随机("数据")元组做些什么。(我说“随机
之后,我通过以下内容开始图像: 命令提示符显示服务器已成功启动,当我试图访问web应用程序时,这也可以工作: 显示适当的HTML欢迎页。
开发JAX-RS应用程序并解决问题。需要从我的资源中自定义json输出以使用Jackson(2.22.2)解析器而不是默认Moxy(根据此答案)。 这是pom。xml片段 我还配置web.xml文件默认使用Jackson 但是资源输出与我使用注释和序列化器配置的有所不同。这是表示为json的模型 和序列化程序 } 这是资源片段 响应json根本不是定制的。 期望的输出是 谢谢。
我是solr的新手,当我试图在Solr中序列化/反序列化一个Map时,我遇到了一个问题。 我在Java应用程序中使用Spring Data Solr,如下所示: 它在Solr中展平并序列化我地图,如下所示: 但是,当我运行搜索时,返回的对象始终将此字段设置为 NULL。反序列化不适用于此特定字段,看起来它无法识别键 1、键 2...作为地图的一部分。 有人知道如何使派生工作吗?我必须实现自定义转换
下面是我的项目的实体类 这是会话表 这里是用户实体 我正在使用JPARepository在我的mysql数据库中保存训练和会话对象 但每当我保存训练对象或会话对象时 我得到了错误 我谷歌了它,发现我需要序列化和反序列化手动…但我不知道怎么做…请帮帮我..