如何使用 Jackson - MismatchedInputException 反序列化 Java 中字符串中的 json 字符串
How to Deserialize json string inside string in Java using Jackson - MismatchedInputException
我正在尝试反序列化字符串中的 json 字符串。我从另一个系统的 Kafka 得到这个响应并处理它,所以没有选择更改发布代码。额外引号是问题所在,但由于它是来自不同系统的消息,所以我的输入是固定的
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class TestModel {
private Model model;
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Model {
private String message;
}
Driver代码:
String t = "\"{\\"model\\":{\\"message\\":\\"sample\\"}}\"";
System.out.println(objectMapper.readValue(t, TestModel.class)) //Exception
当我尝试反序列化同一个字符串时,出现以下异常。
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.TestModel` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"model":{"message":"sample"}}')
at [Source: (String)""{\"model\":{\"message\":\"sample\"}}""; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1373)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
at Sample.main(Sample.java:15)
有人可以就此提出建议吗..
像这样的东西会起作用。
String t = "\"{\\"message\\":\\"test\\"}\"";
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
JsonFactory factory = mapper.getFactory();
JsonParser createParser = factory.createParser(t);
JsonNode actualObj1 = mapper.readTree(createParser);
TestModel t11 = mapper.readValue(actualObj1.asText(), TestModel.class);
System.out.println(t11.getMessage());
下面是测试模型class
public class TestModel {
public TestModel() {
}
@JsonProperty("message")
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我正在尝试反序列化字符串中的 json 字符串。我从另一个系统的 Kafka 得到这个响应并处理它,所以没有选择更改发布代码。额外引号是问题所在,但由于它是来自不同系统的消息,所以我的输入是固定的
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class TestModel {
private Model model;
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Model {
private String message;
}
Driver代码:
String t = "\"{\\"model\\":{\\"message\\":\\"sample\\"}}\"";
System.out.println(objectMapper.readValue(t, TestModel.class)) //Exception
当我尝试反序列化同一个字符串时,出现以下异常。
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.TestModel` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"model":{"message":"sample"}}')
at [Source: (String)""{\"model\":{\"message\":\"sample\"}}""; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1373)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
at Sample.main(Sample.java:15)
有人可以就此提出建议吗..
像这样的东西会起作用。
String t = "\"{\\"message\\":\\"test\\"}\"";
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
JsonFactory factory = mapper.getFactory();
JsonParser createParser = factory.createParser(t);
JsonNode actualObj1 = mapper.readTree(createParser);
TestModel t11 = mapper.readValue(actualObj1.asText(), TestModel.class);
System.out.println(t11.getMessage());
下面是测试模型class
public class TestModel {
public TestModel() {
}
@JsonProperty("message")
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}