无法反序列化JSON输入

时间:2018-11-16 19:54:18

标签: java json rest web-services jackson

我正在使用JAX-RS和Apache CXF开发宁静的Web服务。杰克逊在类路径中,但是我不确定Apache CXF是否使用相同的序列化/反序列化类。我正在尝试发布一个对象(DTO),它是一个内部静态类,看起来像这样:

  @XmlRootElement(name = "dto")
  public static class DTO implements Comparable<DTO>, Cloneable{

  private long id;
  private String name; 
  private Collection<Class1> obj1;
  private Collection<Class2> obj2;
  @JsonDeserialize(as=SomeConcreteClass.class)
  private Collection<String, Class3> obj3;

  //getters and setters
  }

Class1,Class2和Class3也是DTO类所在的外部类中的内部静态类。其中的类(包括我的DTO类)不使用任何JSON注释进行注释,而仅使用XML注释(例如@XmlRootElement和@XMLType)进行注释。是否应使用@JsonTypeName之类的JSON注释对DTO类以及Class1,Class2和Class3进行注释?

还有另一个内部类(在同一外部类内),它包含上述DTO的集合,看起来像这样:

@XmlRootElement(name = "dtos")
@XmlType(name = "DTOsType")
public static class DTOs{
    @JsonProperty("dtos")
    private Collection<DTO> values;

    public DTOs() {
    }

    public DTOs(final Collection<DTO> values) {
        this.values = values;
    }

    @JsonProperty("dtos")
    @XmlElement(name = "dto")
    public Collection<DTO> getValues() {
        return values;
    }
    @JsonProperty("dtos")
    public void setValues(final Collection<DTO> values) {
        this.values = values;
    }
}

obj1和obj2内部是TreeSet,而obj3内部是TreeMap。

在服务器端,我的端点如下

 @POST
 @Path("{name}/endpoint")
 @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML,
        MediaType.APPLICATION_JSON })
 @Produces({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML,
        MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
 public Response addDTO(@PathParam("name") String name, DTOs dtos) {

 //code here
 ...........
 ...........
 }

JSON输入如下所示

 {
"dtos": 
 {

"dto": 
{
    "class1s":
    {
    "class1": [
        {
           .......
        },
        {
           ........
        }
    ]},
    "name": "somename",
    "class3s": 
    {
    "class3": 
    {
        .........
    }
    },
    "id": 555589024908,

}
}

现在,当我通过邮递员在请求正文中发送JSON时,出现以下错误

Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT 
token
at [Source: (org.apache.cxf.transport.http.AbstractHTTPDestination$1); line: 
3, column: 1] (through reference chain: my DTO class ["dto"])

我已经经历过了:

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

我不确定如何编写包装器或将JSON作为字符串发送到我的后端REST方法。问题在于反序列化部分由框架处理。

此服务与XML输入一起很好地工作。

有指针吗?

谢谢!

0 个答案:

没有答案