我正在寻找一种针对Jackson的反序列化JSON到类实例的解决方案,而不会破坏整个过程,目前,当我执行以下操作时:
如果Actor.class类似于:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder(alphabetic = true)
public abstract class BaseDTO {
}
public class Character extend BaseDTO {
private LocalDateTime updatedDate;
private String name;
// Setters and getters
}
反序列化json {"updatedDate":"N/A", "name": "Jon Snow"}
,例如:
String json = "{\"updatedDate\":\"N/A\", \"name\": \"Jon Snow\"}";
ObjectMapper mapper = new ObjectMapper();
final Character character = mapper.reader().forType(Character.class).readValue(json);
或直接作为Play框架:
final Character character = Json.fromJson(json, Character.class);
我肯定会收到类似这样的异常
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "N/A": Text 'N/A' could not be parsed at index 0
InvalidFormatException
实际上是JsonProcessingException
,还有MismatchedInputException
和其他例外,因此我需要以某种方式优雅地继续处理并获取对象character
并拥有{至少{1}}值而不是完全停止。
我更愿意:
name
的任何解决方案。我现在真的需要付出巨大的努力才能找到出路,所以我想知道是否有任何现成的解决方案可以在不重新发明轮子的情况下做到这一点。
答案 0 :(得分:0)
我假设您不希望将N/A
之类的字符串视为空。使用自定义解串器可以像这样实现。
class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws IOException {
if ("N/A".equals(p.getText())) return null;
return LocalDateTime.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(p.getText()));
}
}
希望这会有所帮助!