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

时间:2019-11-28 15:49:46

标签: java spring-boot jackson objectmapper

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

  

json字符串:“ {\” id \“:\” 1 \“,\” desc \“:\” test \“}”    例外
  无法构造Entity的实例(尽管至少存在一个创建者):   没有要从中反序列化的String-argument构造函数/工厂方法   [源:(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;
}

和下面是控制器发布方法

@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字符串?

3 个答案:

答案 0 :(得分:1)

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);
}

答案 1 :(得分:0)

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

long long

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

答案 2 :(得分:0)

您可以使用此:

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

以此替换第一引号和结束引号。