首页 > 解决方案 > com.fasterxml.jackson.databind.exc.MismatchedInputException:

问题描述

我在请求正文中使用转义字符发布 json 字符串并将其映射到控制器中的模型,但它抛出异常

json string : "{\"id\":\"1\",\"desc\":\"test\"}" 异常
无法构造实例Entity(尽管至少存在一个 Creator):没有字符串参数构造函数/factory 方法从 [Source: (String)" "{\"id\":\"1\" 处的字符串值 ('{"id":"1","desc":"test"}') 反序列化,\"desc\":\"测试\"}""; 行:2,列:2]"

但是当我使用没有转义字符的 json 字符串时,它工作正常 json 字符串

{"id":"1","desc":"test"}

模型

class Entity
{
@Id 
String id ;
Map<String, Object> dynamicFields = new LinkedHashMap<>();

@JsonAnySetter
void setDetail(String key, Object value) {
    dynamicFields.put(key, value);
}


public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public Map<String, Object> getDynamicFields() {
    return dynamicFields;
}

public void setDynamicFields(Map<String, Object> dynamicFields) {
    this.dynamicFields = dynamicFields;
}

以下是控制器发布方法

@PostMapping("")
ResponseEntity<Entity> create(@RequestBody String jsonString) throws JsonParseException, 
JsonMappingException, IOException {
    objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
     Entity mongoStoredEnity = objectMapper.readValue(jsonString,  Entity.class);
//rest of the code ....
}

关于这个为什么它只接受没有转义字符的json字符串的任何线索?

标签: javaspring-bootjacksonobjectmapper

解决方案


TLDR:不要发送前导引号,否则该值将被解释为字符串。

您输入了错误的值,即您的输入实际上"\"{\"id\":\"1\",\"desc\":\"test\"}\""不是正确的值"{\"id\":\"1\",\"desc\":\"test\"}"。即您需要删除前导和尾随"

编辑:如果你想测试它:

public static void main(final String[] args) throws JsonParseException, JsonMappingException, IOException {
    final ObjectMapper om = new ObjectMapper();
    om.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    final String jsonString = "\"{\"id\":\"1\",\"desc\":\"test\"}\""; // this throws your MismatchedInputException
    final String jsonStringCorrect = "{\"id\":\"1\",\"desc\":\"test\"}"; // this works as expected
    final Entity mongoStoredEnity = om.readValue(jsonStringCorrect, Entity.class);
    System.out.println(mongoStoredEnity);
}

推荐阅读