首页 > 解决方案 > 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;
}
}

标签: javajsonduplicates

解决方案


推荐阅读