相关疑难解决方法(0)

如何自定义JAXB对象列表到JSON的序列化?

我正在使用Jersey为服务器组件创建REST Web服务.

我想在列表中序列化的JAXB注释对象如下所示:

@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
    "id", "name"
})
public class XMLDistribution {
    private String id;
    private String name;
    // no-args constructor, getters, setters, etc
}
Run Code Online (Sandbox Code Playgroud)

我有一个REST资源来检索一个看起来像这样的发行版:

@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
    @GET
    @Produces("application/json")
    public XMLDistribution retrieve(@PathParam("id") String id) {
        return retrieveDistribution(Long.parseLong(id));
    }
    // business logic (retrieveDistribution(long))
}
Run Code Online (Sandbox Code Playgroud)

我还有一个REST资源来检索所有发行版的列表,如下所示:

@Path("/distributions")
public class RESTDistributions {
    @GET
    @Produces("application/json")
    public List<XMLDistribution> retrieveAll() {
        return retrieveDistributions();
    }
    // business logic (retrieveDistributions())
}
Run Code Online (Sandbox Code Playgroud)

我使用ContextResolver来自定义JAXB序列化,当前配置如下:

@Provider
@Produces("application/json")
public class …
Run Code Online (Sandbox Code Playgroud)

serialization json jax-rs jaxb jersey

54
推荐指数
2
解决办法
5万
查看次数

无法从VALUE_STRING中反序列化java.util.ArrayList的实例

我有一个使用Jersey构建的REST服务,并部署在AppEngine中.REST服务实现使用application/json媒体类型的动词PUT.数据绑定由Jackson执行.

动词使用JSON表示的企业部门关系

{"name":"myEnterprise", "departments":["HR","IT","SC"]}
Run Code Online (Sandbox Code Playgroud)

在客户端,我使用gson将JSON表示转换为java对象.然后,我将对象传递给我的REST服务,它工作正常.

问题:

当我的JSON表示在集合中只有一个项目时

{"name":"myEnterprise", "departments":["HR"]}
Run Code Online (Sandbox Code Playgroud)

该服务无法反序列化该对象.

ATTENTION: /enterprise/enterprise: org.codehaus.jackson.map.JsonMappingException: 
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at 
[Source: org.mortbay.jetty.HttpParser$Input@5a9c5842; line: 1, column: 2
Run Code Online (Sandbox Code Playgroud)

正如其他用户所报告的那样,解决方案是添加标志ACCEPT_SINGLE_VALUE_AS_ARRAY(例如,Jersey:无法从String中反序列化ArrayList的实例).然而,我并不是在控制ObjectMapper,因为在服务方面它是由Jackson透明地制作的.

题:

有没有办法在服务端配置ObjectMapper以启用ACCEPT_SINGLE_VALUE_AS_ARRAY?注释?web.xml中?

代码细节

Java对象:

@XmlRootElement
public class Enterprise {
    private String name;
    private List<String> departments;

    public Enterprise() {}

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<String> getDepartments() {
        return departments;
    }
    public void setDepartments(List<String> departments) {
        this.departments …
Run Code Online (Sandbox Code Playgroud)

java json arraylist jackson json-deserialization

52
推荐指数
5
解决办法
15万
查看次数

Spring RestTemplate给出"500"错误但是相同的URL,凭证在RestClient和Curl中起作用

Url,Credentials在RestClient UI以及Curl中工作,因为当通过Spring RestTemplate访问相同内容时,我遇到"500"错误.

我使用以下代码:

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);
Run Code Online (Sandbox Code Playgroud)

请告诉我您的建议或意见以解决问题.

spring

15
推荐指数
4
解决办法
7万
查看次数

将Jersey/Jackson配置为不使用@XmlElement字段注释进行JSON字段命名

我正在运行Jersey REST服务.代表我的资源的POJO是JAXB(XML)带注释的简单Java类(它们是从模式定义生成的 - 因此它们具有注释).

我希望Jersey/Jackson忽略XML-Annotations.我在我的web.xml中做了这个配置(如这里提到的):

  <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
  </init-param>
Run Code Online (Sandbox Code Playgroud)

我现在预计@ZMLElement注释将不再用于JSON字段命名策略.

但是看看这个java字段(成员)

@XmlElement(name = "person", required = true)
protected List<Person> persons;
Run Code Online (Sandbox Code Playgroud)

我仍然得到以下JSON表示:

....,"person":[{"name":"FooBar", ....... (person without the 's')
Run Code Online (Sandbox Code Playgroud)

所有其他字段仍然从@XmlElement注释中获取其JSON名称,而不是从Java字段名称获取.

我想实现杰克逊完整数据绑定(POJO)示例中描述的JSON输出.

它在这样的简单测试中工作正常(使用我的XML注释类):

  ObjectMapper mapper = new ObjectMapper(); 
  mapper.writeValue(System.out, myObject);
Run Code Online (Sandbox Code Playgroud)

但嵌入在泽西岛我没有得到预期的JSON输出.

他们在Jersey中的其他配置选项是否获得"简单"POJO JSON表示(因为这最适合必须反序列化JSON结果的客户端).

谢谢克劳斯

详细解决方案

(1)ContextResolver为Jacksons 实现一个ObjectMapper创建不使用注释的ObjectMapper的Jacksons .

package foo.bar.jackson;

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

/**
 * Customized {@code ContextResolver} implementation that does not use any …
Run Code Online (Sandbox Code Playgroud)

java json jersey jackson

14
推荐指数
1
解决办法
2万
查看次数

Jaxb json缺少一个元素数组的括号

我正在使用JAXB/Jersey(1.3)在REST API中将java转换为json.我读了很多关于这个问题,我尝试了这个解决方案,它工作了一半:

@XmlRootElement  
public class ArrayWrapper    
{  
        public List<String> list = new LinkedList<String>();  
}
Run Code Online (Sandbox Code Playgroud)

和我的ContextResolver:

@Provider  
public class JAXBContextResolver implements ContextResolver<JAXBContext> {  

        private JAXBContext context;

        private Class[] types = {ArrayWrapper.class,Wrapper.class};

        public JAXBContextResolver() throws Exception {

            MappedBuilder builder = JSONConfiguration.mapped();
            builder.arrays("list");
            builder.rootUnwrapping(true);
            this.context = new JSONJAXBContext(builder.build(), types);
}  
Run Code Online (Sandbox Code Playgroud)

ArrayWrapper aw = new ArrayWrapper();
aw.list.add( "测试");

我得到{"list":["test"]}所以它可以工作但是当我在其他类中包装ArrayWrapper时它不起作用:

@XmlRootElement  
public class Wrapper  
{  
    public ArrayWrapper aw;

    public Wrapper()
    {
        aw=new ArrayWrapper();
        aw.list.add("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

new Wrapper();
我得到{"aw":{"list":"test"}}

谁知道怎么修它?

json brackets jaxb

5
推荐指数
1
解决办法
4993
查看次数

杰克逊反序列化 - 包含ArrayList <T>

美好的一天,

我目前正在集成尝试使用Jackson(使用Jersey)使用生成JSON(用.NET编写)的REST服务.JSON由可能的错误消息和对象数组组成.下面是Jersey的日志记录过滤器返回的JSON示例:

{
    "error":null,
    "object":"[{\"Id\":16,\"Class\":\"ReportType\",\"ClassID\":\"4\",\"ListItemParent_ID\":4,\"Item\":\"Pothole\",\"Description\":\"Pothole\",\"Sequence\":1,\"LastEditDate\":null,\"LastEditor\":null,\"ItemStatus\":\"Active\",\"ItemColor\":\"#00AF64\"}]"
}
Run Code Online (Sandbox Code Playgroud)

我有两个类来表示类型(外部ListResponse):

public class ListResponse { 

    public String error;    
    public ArrayList<ListItem> object;  

    public ListResponse() { 
    }
}
Run Code Online (Sandbox Code Playgroud)

和(内部ListItem):

public class ListItem {
    @JsonProperty("Id")
    public int id;      
    @JsonProperty("Class")
    public String classType;
    @JsonProperty("ClassID")
    public String classId;  
    @JsonProperty("ListItemParent_ID")
    public int parentId;    
    @JsonProperty("Item")
    public String item; 
    @JsonProperty("Description")
    public String description;

    @JsonAnySetter 
    public void handleUnknown(String key, Object value) {}

    public ListItem() {
    }
}
Run Code Online (Sandbox Code Playgroud)

调用并返回JSON的类如下所示:

public class CitizenPlusService {
    private Client client = null;   
    private WebResource service = null;     

    public …
Run Code Online (Sandbox Code Playgroud)

json jackson

4
推荐指数
2
解决办法
2万
查看次数