source

java.lang의 공백 JSON 문자열 값을 늘로 역직렬화하는 방법.스트링?

manycodes 2023. 3. 2. 22:22
반응형

java.lang의 공백 JSON 문자열 값을 늘로 역직렬화하는 방법.스트링?

java 오브젝트에 디시리얼라이즈를 하기 위해 간단한 JSON을 시도하고 있습니다., 빈 String 값을 가져오고 있습니다.java.lang.String속성 값나머지 속성에서는 빈 값이 null 으로 변환됩니다(원하는 값).

내 JSON 및 관련 Java 클래스는 다음과 같습니다.

JSON 문자열:

{
  "eventId" : 1,
  "title" : "sample event",
  "location" : "" 
}

EventBean 클래스 POJO:

public class EventBean {

    public Long eventId;
    public String title;
    public String location;

}

주 클래스 코드:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

try {
    File file = new   File(JsonTest.class.getClassLoader().getResource("event.txt").getFile());

    JsonNode root = mapper.readTree(file);
    // find out the applicationId

    EventBean e = mapper.treeToValue(root, EventBean.class);
    System.out.println("It is " + e.location);
}

"It's null"이라고 인쇄될 줄 알았어요.대신 "It is"라고 표시됩니다.분명히 잭슨String 오브젝트 타입으로 변환할 때 빈 String 값을 NULL로 취급하지 않습니다.

나는 어디선가 그것이 예상된 것이라고 읽었다.단, java.lang은 피하고 싶습니다.스트링도.간단한 방법이 있나요?

잭슨은 다른 오브젝트에 대해서는 null을 제공하지만 String에 대해서는 빈 String을 제공합니다.

커스텀을 사용할 수 있습니다.JsonDeserializer이 조작을 실시합니다.

class CustomDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
        JsonNode node = jsonParser.readValueAsTree();
        if (node.asText().isEmpty()) {
            return null;
        }
        return node.toString();
    }

}

클래스에서는 Location 필드에 사용해야 합니다.

class EventBean {
    public Long eventId;
    public String title;

    @JsonDeserialize(using = CustomDeserializer.class)
    public String location;
}

표준 String deserializer를 덮어쓰고 String 유형의 커스텀디시리얼라이저를 정의할 수 있습니다.

this.mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();

module.addDeserializer(String.class, new StdDeserializer<String>(String.class) {

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String result = StringDeserializer.instance.deserialize(p, ctxt);
        if (StringUtils.isEmpty(result)) {
            return null;
        }
        return result;
    }
});

mapper.registerModule(module);

이렇게 하면 모든 String 필드가 동일하게 동작합니다.

먼저 이 기능을 요구하는 Github 문제에 진전이 있는지 확인합니다.

스프링 부트를 사용하는 사용자:jgesser의 답변이 가장 도움이 되었습니다만, Spring Boot에서 최적인 설정 방법을 찾으려고 했습니다.

실제로 문서에는 다음과 같이 기재되어 있습니다.

com.fasterxml.jackson.databind 유형의 콩.모듈은 자동으로 설정된 Jackson2ObjectMapperBuilder에 등록되며 작성된 모든 ObjectMapper 인스턴스에 적용됩니다.

여기 jgesser의 답변은 Spring Boot 어플리케이션의 새로운 클래스에 복사하여 붙여넣을 수 있는 것으로 확대되어 있습니다.

@Configuration
public class EmptyStringAsNullJacksonConfiguration {

  @Bean
  SimpleModule emptyStringAsNullModule() {
    SimpleModule module = new SimpleModule();

    module.addDeserializer(
        String.class,
        new StdDeserializer<String>(String.class) {

          @Override
          public String deserialize(JsonParser parser, DeserializationContext context)
              throws IOException {
            String result = StringDeserializer.instance.deserialize(parser, context);
            if (StringUtils.isEmpty(result)) {
              return null;
            }
            return result;
          }
        });

    return module;
  }
}

다음 구성을 통해 얻을 수 있습니다.

final ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);

JsonCreator 주석을 사용할 수 있습니다.그것은 나에게 효과가 있었다.

public class Foo {
private String field;

 @JsonCreator
 public Foo(
   @JsonProrerty("field") String field) {
     this.field = StringUtils.EMPTY.equals(field) ? null : field ;
}
}

언급URL : https://stackoverflow.com/questions/30841981/how-to-deserialize-a-blank-json-string-value-to-null-for-java-lang-string

반응형