java - 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字符串的任何线索?
解决方案
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);
}
推荐阅读
- mysql - 在 MySQL 中:选择关键字的出版物,但在结果中包括所有关键字
- c++ - 来自 FBO 的反射纹理得到正确的图像
- django - Django 2.0 使用字段数组从模型中检索数据
- spring-boot - 微服务:没有得到响应,但所有服务都在运行
- chatbot - Microsoft LUIS 多语言支持
- javascript - Firefox JavaScript 中的插件 - 将本机应用程序与 Promise 链接
- hadoop - 如何获取特定配置单元查询的 CPU、内存和 IO 使用情况?
- rest - 从QA工程师的角度如何搭建mock server
- javascript - 如何在 three.js 中使用 AMFLoader 加载 3D 对象?
- sql - 为什么 SQLite CTE JOIN 中的 RANDOM() 行为与其他 RDBMS 不同?