用双引号括起来的 POJO Json 对象不会反序列化为 Java



我的应用程序正在接收来自某个源的json对象,这些对象被包装为字符串。这些并没有被反序列化,而是抛出了如下所述的异常。我已经创建了一个示例程序来重现这一点。有人能指出,在反序列化或对象映射器配置时,是否有一种方法可以忽略json字段周围的额外引号。

@Test
void testTrade() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Trade trade = new Trade(2.3, "USD");
String json = mapper.writeValueAsString(trade);
System.out.println(json);
Trade res = mapper.readerFor(Trade.class).readValue(json);
Assertions.assertEquals(trade, res);
String jsonString = "{"value":2.3,"currency":"USD"}";
Trade res1 = mapper.readerFor(Trade.class).readValue(jsonString);
String jsonString2 = ""{\"value\":2.3,\"currency\":\"USD\"}"";

//This throws exception : Cannot construct instance of `com....Trade` (although at least one Creator exists):
Trade res2 = mapper.readerFor(Trade.class).readValue(jsonString2);
}
}
class Trade {
double value;
String currency;
@JsonCreator
public Trade(@JsonProperty("value") double value, @JsonProperty("currency") String currency) {
this.value = value;
this.currency = currency;
}
//getters, equals, hashcode, toString()
}

例外:

Cannot construct instance of `com....Trade` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"value":2.3,"currency":"USD"}')
at [Source: (String)""{"value":2.3,"currency":"USD"}""; line: 1, column: 1]
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com....Trade` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"value":2.3,"currency":"USD"}')
at [Source: (String)""{"value":2.3,"currency":"USD"}""; line: 1, column: 1]

基本答案来自How do I unescape a JSON String using Java/Jonson?

有一个用于unescape字符串的apache通用util。

org.apache.commons.text.StringEscapeUtils;

但是,在您的情况中,您的字符串还有一个问题,您还需要修剪第一个和最后一个重复出现的双引号。然后您就可以在上应用unescape util了。

jsonString2 = jsonString2.substring(1, jsonString2.length() - 1);
jsonString2 = StringEscapeUtils.unescapeJava(jsonString2);

希望它能解决你的案子。

最新更新