Java com.fasterxml.jackson.databind.exc.MismatchedInputException:

Java com.fasterxml.jackson.databind.exc.MismatchedInputException:,java,spring-boot,jackson,objectmapper,Java,Spring Boot,Jackson,Objectmapper,我在请求体中发布带有转义字符的json字符串,并将其映射到控制器中的模型,但它抛出以下异常 json字符串:“{\'id\':\'1\',\'desc\':\'test\'}” 例外情况 无法构造实体的实例(尽管至少存在一个创建者): 没有可从中反序列化的字符串参数构造函数/工厂方法 [Source:(String)”处的字符串值('{“id”:“1”,“desc”:“test”}') “{\'id\':\'1\',\'desc\':\'test\'}”“;行:2,列:2]” 但当我使用不带转义

我在请求体中发布带有转义字符的json字符串,并将其映射到控制器中的模型,但它抛出以下异常

json字符串:“{\'id\':\'1\',\'desc\':\'test\'}” 例外情况
无法构造
实体的实例(尽管至少存在一个创建者):
没有可从中反序列化的字符串参数构造函数/工厂方法
[Source:(String)”处的字符串值('{“id”:“1”,“desc”:“test”}')
“{\'id\':\'1\',\'desc\':\'test\'}”“;行: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;
}
类实体
{
@身份证
字符串id;
Map dynamicFields=新建LinkedHashMap();
@JSONANYSETER
void setDetail(字符串键、对象值){
dynamicFields.put(键、值);
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共地图getDynamicFields(){
返回动态字段;
}
公共void集合dynamicFields(映射dynamicFields){
this.dynamicFields=dynamicFields;
}
下面是控制器post方法

@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 ....
}
@PostMapping(“”)
ResponseEntity创建(@RequestBody String jsonString)抛出JsonParseException,
JsonMappingException,IOException{
enable(反序列化功能。接受\u空\u字符串\u作为\u空\u对象);
实体MongoStoreIdentity=objectMapper.readValue(jsonString,Entity.class);
//代码的其余部分。。。。
}

关于这一点,有什么线索可以解释为什么它只接受不带转义字符的json字符串吗?

尝试用以下代码替换反斜杠

String jsonFormattedString = jsonString.replaceAll("\\\\", "");

然后将其传递给对象映射器

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);
}
您可以使用以下选项:

myString.replace("\"{", "{").replace("}\"", "}")

这样,就可以替换第一个引号和最后一个引号。

如果我硬编码
objectMapper.readValue(“{\'id\':\'1\',\'desc\':\'test\'”,Entity.class),代码对我有效
。我猜传入的
jsonString
包含一些不同的字符,可能是转义字符。你能调试
jsonString
的实际值吗?我从google arc客户端发送,实际值是正确的,只有你能在异常消息中观察到它自身可能的重复,没有机会阅读q注意。当我从rest客户端发送带有转义字符的有效json字符串时,我无法映射到pojo。我正在传递一个有效的json,它也应该与转义字符一起工作。替换反斜杠是一个额外的操作,会导致性能问题,并且我在实际上下文中发送了一个长json字符串。不,我发送的json与此类似从google arc客户端“{\“id\”:“1\”,“desc\”:“test\”}\“当然,请删除前导和尾随引号使其成为json对象,即只需输入{\“id\”:“1\”,“desc\”:“test\”}”如果我像那样通过,rest客户端会抱怨它不是一个有效的json。你可以在线检查它是否是一个有效的json或notAh,好吧,是的,但有趣的是,这对jackson来说没什么问题。然而,
“无效的{}//json[[”
或任何其他有效字符串都是有效的json,但您需要该对象。另外:为什么您有这些转义字符?为什么您没有
@RequestBody Entity mongostoredentity