【问题标题】:Spring MVC JSON deserialization with malformed JSON ( Jackson )Spring MVC JSON 反序列化与格式错误的 JSON ( Jackson )
【发布时间】:2017-01-10 11:00:43
【问题描述】:

在 REST api 上,我收到一个映射到 Java 对象的 Json:

@RequestMapping(value = "/example", method = RequestMethod.POST)
    public @ResponseBody
    ReturnObject doReturn(@RequestBody ProblemObject requestBody)

对象很简单:

public class ProblemObject implements Serializable {

    private String field1;
    private String field2;

    public ProblemObject(String field2) {
        this.field2 = field2;
    }  

    public ProblemObject(String field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }
}

问题是 Jackson 尝试反序列化甚至是格式错误的 JSON,但结果不太好,例如它接受:

 "field1": "test",
 "field2": "test"
}

注意没有左大括号。这会导致对象与值为“field2”且 field2 为空的 field1 进行映射。
它也不接受逗号,结果更差。
目前我能想到的唯一选择是实现自定义反序列化器,但这不是最佳的恕我直言。
有没有办法让杰克逊更严格?

【问题讨论】:

  • 我的建议是使用某种 JSON 验证器,如果有效性测试失败,则抛出异常。 application.properties 中的 Jackson 属性似乎没有任何选项来设置 Jackson 的严格程度。

标签: spring-mvc spring-boot jackson


【解决方案1】:

我会尝试在您的 @RequestMapping 注释中更加明确,并告诉 API 它应该使用什么:

@RequestMapping(value = "/example", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)

【讨论】:

  • 不幸的是,它仍然接受没有左大括号的 JSON。
  • 那么您的配置有误。您应该会收到 415 响应。您介意编辑您的帖子并添加您的 Web MVC 配置吗?
  • 它是带有web依赖的spring boot,默认配置。您看到的代码位于带有 \@RestController 的控制器内。 Jackson v2.8.1,Spring Boot v1.4.0.RELEASE
  • 我通过示例项目向 jackon 发布了错误报告:github.com/FasterXML/jackson-databind/issues/1494
  • 出于某种原因,您的单个参数 String 构造函数允许 Jackson 接受格式错误的 JSON。即使您只是将“blah”(无括号)传递给端点,它也不会出错。如果您删除该构造函数,则一切正常。不是真正的解决方案,但你是对的,这可能是一个错误。
【解决方案2】:

这显然是杰克逊 TokenBuffer 中的一个错误。 issue 已打开,Jackson 开发人员已确认该错误。
这是由于单个 String 构造函数。如果可能,删除构造函数是一种临时解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多