首页 > 解决方案 > 邮递员无法解析 JSON 对象

问题描述

我正在使用 dropwizard 框架,我正在尝试PUT通过邮递员请求,但我得到:

{
    "code": 400,
    "message": "Unable to process JSON"
} 

POSTMAN 请求的正文是:

[{"v1":".abc",
"v2": false,
"v3": 2,
"v4": ["Other"]}]

我的资源文件如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;


@Path(value = "/v1/")
public class SomeClass {

    private static final Logger LOGGER = LoggerFactory.getLogger(SomeClass.class);

    @PUT
    @Path(value = "/path/{value}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response addCandidates(@PathParam(value = "value") String value, OtherClass otherclass) {
        LOGGER.info("Request recieved"); // this line is not getting executed
        return Response.status(Response.Status.OK).entity(null).build();
    }
}

类定义:

import lombok.Data;
import java.util.List;

@Data
public class OtherClass {
    private List<Something> something;
}


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown=true)
public class Something extends abc {
}

表架构:

import java.util.Set;

@Data
public class abc implements Comparable<abc> {
    @PrimaryKey
    @JSONField(name = "v1")
    public String v1;

    @JSONField(name = "v2")
    public boolean v2;

    @JSONField(name = "v3")
    public Integer v3;

    @JSONField(name = "v4")
    public Set<String> v4;

}

当我要去 POSTMAN 的调试控制台时,它会显示正确的填充值。我不确定是否v4是导致问题的原因

标签: javapostman

解决方案


您的 json 不正确,您正在尝试将对象数组解析为OtherClass不是数组的对象。所以你的json应该是:

{
    "something": [
        {
            "v1": ".abc",
            "v2": false,
            "v3": 2,
            "v4": [
                "Other"
            ]
        }
    ]
}

此外,您正在混合注释 - @JSONField来自 FastJson 库,但@JsonIgnoreProperties来自 Jackson,因此请确保使用相同的序列化器。


推荐阅读