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
'source' 카테고리의 다른 글
TinyMCE가 WordPress에서 활성 상태인지 확인하는 방법 (0) | 2023.03.02 |
---|---|
Angular JS - $destroy는 이벤트 청취자를 제거합니까? (0) | 2023.03.02 |
ReactJS 서버측 렌더링과 클라이언트측 렌더링 (0) | 2023.03.02 |
jQuery.serialize() 데이터를 JSON 개체로 변환하려면 어떻게 해야 합니까? (0) | 2023.03.02 |
angularjs를 사용하여 폼을 연재할 수 있는 더 효과적인 방법이 있나요? (0) | 2023.03.02 |