繁体   English   中英

@RequestBody映射复杂的json对象

[英]@RequestBody mapping complex json object

我需要将json以下的内容转换为@RequestBody的java对象。

{
    "entity": {
        "id": 3,
        "name": "james"
    },
    "conjunction": "OR",
    "conditions": [
        {
            "operation": "equalTo",
            "dataKey": "department",
            "dataType": "string",
            "value": "abc"
        },
        {
            "operation": "notEqualTo",
            "dataKey": "ID",
            "dataType": "number",
            "value": "100"
        },
        {
            "operation": "notEqualTo",
            "dataKey": "name",
            "dataType": "strubg",
            "value": "jack"
        },
        {
            "operation": "between",
            "dataKey": "END_DATE",
            "dataType": "date",
            "value1": "20180502",
            "value2": "20180519"
        }
    ]
}

数组中的前三个元素对应于下面的java对象。

public class ComparisonCondition extends Condition {
    private String value;
}

最后一个元素对应于object之下。

public class BetweenCondition extends Condition {
    private String value1;
    private String value2;
}

它们都从下面的对象继承。

public class Condition {
    private String dataKey;
    private String dataType;
    private String operation;
}

spring mvc方法如下。

@RequestMapping(value = RequestAction.FILTER, method = RequestMethod.POST)
public List<Student>  filter(
        @RequestBody  Filter<Student> filterConfig) {   
    return null;

}

过滤器对象在下面。

public class Filter<T> {
    private String conjunction;
    private T entity;
    private List<Condition> conditions;
}

如何将json成功映射到Java对象? 当前,它报告"Could not read JSON: Unrecognized field "value" (class com.ssc.rest.entity.Condition), not marked as ignorable (3 known properties: "dataType", "dataKey", "operation"])

对于您的错误,如果杰克逊解析器不知道某个字段,则会引发异常。

您可以通过添加注释来避免这种情况:

@JsonIgnore(ignoreUnknown=true)

在目标对象上。

对于您的映射,我建议您创建一个与json输入相对应的对象,然后手动将其映射到目标对象。

您正在JSON中传递4个变量作为COndition

{
    "operation": "equalTo",
    "dataKey": "department",
    "dataType": "string",
    "value": "abc"
},

但是您的Java POJO只有3个变量

public class Condition {
    private String dataKey;
    private String dataType;
    private String operation;
}

只要增加value就可以了。

底线是: POJO类应具有以JSON传递的所有字段。

顺便说一句,你的例外在说同一件事

Unrecognized field "value"

编辑1:

我错过了BetweenCondition和ComparisonCondition

您可以在案例Condition使用Sub Class属性定义基类,并希望它可以工作

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javaclass")
@JsonSubTypes({
    @Type(value = ComparisonCondition.class),
    @Type(value = BetweenCondition.class)
})

public class Condition {
    private String dataKey;
    private String dataType;
    private String operation;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM