com.fasterxml.jackson.databind.exc.MismatchedInputException:
Posted
技术标签:
【中文标题】com.fasterxml.jackson.databind.exc.MismatchedInputException:【英文标题】:com.fasterxml.jackson.databind.exc.MismatchedInputException: 【发布时间】:2020-03-24 07:42:35 【问题描述】:我在请求正文中使用转义字符发布 json 字符串并将其映射到控制器中的模型,但它抛出异常
json 字符串:"\"id\":\"1\",\"desc\":\"test\"" 异常 无法构造
Entity
的实例(尽管至少存在一个 Creator): 没有要反序列化的字符串参数构造函数/工厂方法 [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;
下面是控制器的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 ....
关于为什么它只接受没有转义字符的 json 字符串的任何线索?
【问题讨论】:
如果我硬编码objectMapper.readValue("\"id\":\"1\",\"desc\":\"test\"", Entity.class);
,该代码对我有用。我的猜测是传入的jsonString
包含一些不同的东西,可能是转义字符。可以调试jsonString
的实际值吗?
我是从 google arc 客户端发送的,实际值是正确的,只有你可以在它自己的异常消息中观察它
How to UNESCAPE String while converting java object to JSON string using Jackson的可能重复
没有机会仔细阅读问题。当我从休息客户端发送带有转义字符的有效 json 字符串时,我无法映射到 pojo
【参考方案1】:
TLDR:不要发送前导引号,否则该值将被解释为字符串。
您输入了错误的值,即您的输入实际上是"\"\"id\":\"1\",\"desc\":\"test\"\""
,而不是正确的值"\"id\":\"1\",\"desc\":\"test\""
。 IE。您需要删除前导和尾随"
。
编辑:如果你想测试它:
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);
【讨论】:
不,我正在从 google arc 客户端 "\"id\":\"1\",\"desc\":\"test\"\" 发送这样的 json跨度> 当然,请去掉前后引号,使其成为json对象,即输入\"id\":\"1\",\"desc\":\"test \" 如果我通过了,rest客户端会抱怨它不是一个有效的json。你可以在线检查它是否是一个有效的json 啊,嗯,是的,但有趣的是杰克逊没问题。但是,"invalid//json[[["
或任何其他有效字符串都是有效的 json,但您需要该对象。
另外:为什么你有那些转义字符?为什么不直接使用@RequestBody Entity mongoStoredEnity
?【参考方案2】:
尝试用以下代码替换反斜杠。
String jsonFormattedString = jsonString.replaceAll("\\\\", "");
然后将其传递给 Object Mapper
【讨论】:
我正在传递一个有效的 json,它也应该与转义字符一起使用。替换反斜杠是一个额外的操作,会导致性能问题,我在我的实际上下文中发送一个长 json 字符串【参考方案3】:你可以用这个:
myString.replace("\"", "").replace("\"", "")
这样,您就可以替换第一个引号和最后一个引号。
【讨论】:
以上是关于com.fasterxml.jackson.databind.exc.MismatchedInputException:的主要内容,如果未能解决你的问题,请参考以下文章