java - JsonParser 获得第一个重复键
问题描述
我创建了一个自定义的 JsonDeserializer,它工作得很好——除了一件事。
每当我尝试使用重复键的 json 时,它都会获取最后一个实例。我们的要求是获得第一个实例,不需要错误。
我正在使用 JsonParser(类扩展为 JsonDeserializer 并覆盖反序列化)来获取树节点并从那里手动执行业务逻辑。
{
"key1":"val1", -> I only need this, discard the rest of same key
"key1":"val2", -> It's showing this
"key2":"val3"
}
我需要做什么才能获得第一个而不是最后一个?
@JsonComponent
public class CustomJsonDeserializer extends JsonDeserializer<TestDTO> {
@Override
public TestDTO deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
Boolean isField1Missing = false;
Boolean isField2Missing = false;
Boolean isField3Missing = false;
Boolean isField4Missing = false;
Boolean isField5Missing = false;
String field1 = null;
String field2 = null;
String field3 = null;
Integer field5 = null;
JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
if (jsonNode.path("field1").isMissingNode()) {
System.out.println("Missing field1");
isField1Missing = true;
} else {
field1 = determineStringValue(jsonNode, "field1");
}
if (jsonNode.path("field2").isMissingNode()) {
System.out.println("Missing field2");
isField2Missing = true;
} else {
field2 = determineStringValue(jsonNode, "field2");
}
if (jsonNode.path("field3").isMissingNode()) {
System.out.println("Missing field3");
isField2Missing = true;
} else {
field3 = determineStringValue(jsonNode, "field3");
}
if (jsonNode.path("field5").isMissingNode()) {
System.out.println("Missing field5");
isField5Missing = true;
} else {
field5 = determineIntegerValue(jsonNode, "field5");
}
return new TestDTO(field1, field2, field3, field5, null, isField1Missing, isField2Missing, isField3Missing, isField4Missing, isField5Missing );
}
private String determineStringValue(JsonNode jsonNode, String field) {
String returnStr = null;
if (jsonNode.path(field).isNull()) {
System.out.println("null field " + field);
return null;
}
if (!Objects.isNull(jsonNode.path(field).asText())) {
returnStr = jsonNode.path(field).asText();
System.out.println("value " + field + " " + returnStr);
}
return returnStr;
}
private Integer determineIntegerValue(JsonNode jsonNode, String field) throws JsonMappingException {
String returnStr = null;
Integer returnInt = null;
if (jsonNode.path(field).isNull()) {
System.out.println("null field " + field);
return null;
}
if (!Objects.isNull(jsonNode.path(field).asText())) {
returnStr = jsonNode.path(field).asText();
System.out.println("value " + field + " " + returnStr);
}
try {
returnInt = Integer.parseInt(returnStr);
} catch (Exception e) {
System.out.println(e.getMessage());
// returnInt = -999;
throw new JsonMappingException("Not readable Cannot deserialize value of type `java.lang.Integer` from String \"" + returnStr + "\": not a valid Integer value");
}
System.out.println(returnInt);
return returnInt;
}
}