我在请求正文中发布了带有转义字符的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字符串?
答案 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("}\"", "}")
以此替换第一引号和结束引号。