잭슨 시리얼화: 빈 값 무시(또는 null)
현재 Jackson 2.1.4를 사용하고 있는데 객체를 JSON 문자열로 변환할 때 필드를 무시하는 데 문제가 있습니다.
다음은 변환할 오브젝트 역할을 하는 클래스입니다.
public class JsonOperation {
public static class Request {
@JsonInclude(Include.NON_EMPTY)
String requestType;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
String username;
String email;
String password;
String birthday;
String coinsPackage;
String coins;
String transactionId;
boolean isLoggedIn;
}
}
public static class Response {
@JsonInclude(Include.NON_EMPTY)
String requestType = null;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN };
enum Status { ok, error };
Status status;
ErrorCode errorCode;
String expiry;
int coins;
String email;
String birthday;
String pictureUrl;
ArrayList <Performer> performer;
}
}
}
변환 방법은 다음과 같습니다.
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
JsonOperation subscribe = new JsonOperation();
subscribe.request.requestType = "login";
subscribe.request.data.username = "Vincent";
subscribe.request.data.password = "test";
Writer strWriter = new StringWriter();
try {
mapper.writeValue(strWriter, subscribe.request);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("JSON", strWriter.toString())
출력은 다음과 같습니다.
{"data":{"birthday":null,"coins":null,"coinsPackage":null,"email":null,"username":"Vincent","password":"test","transactionId":null,"isLoggedIn":false},"requestType":"login"}
어떻게 하면 이러한 늘 값을 피할 수 있을까요?'구독' 목적으로 필요한 정보만 가져오면 됩니다!
제가 찾고 있는 출력은 다음과 같습니다.
{"data":{"username":"Vincent","password":"test"},"requestType":"login"}
@JsonInclude(포함)도 해봤습니다.NON_NULL)을 사용하여 모든 변수를 null로 설정했지만 역시 작동하지 않았습니다.도와주셔서 감사합니다 여러분!
주석이 잘못된 위치에 있습니다. 주석이 필드가 아닌 클래스에 있어야 합니다. 예:
@JsonInclude(Include.NON_NULL) //or Include.NON_EMPTY, if that fits your use case
public static class Request {
// ...
}
주석에서 설명한 바와 같이 2.x 이전 버전에서는 이 주석의 구문은 다음과 같습니다.
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) // or JsonSerialize.Inclusion.NON_EMPTY
또 다른 옵션은, 다음의 설정을 실시하는 것입니다.ObjectMapper직접, 단순히 전화하는 것만으로mapper.setSerializationInclusion(Include.NON_NULL);
(기록상 이 답변의 인기는 이 주석이 필드별로 적용되어야 한다는 것을 보여주는 것이라고 생각합니다.@fasterxml)
글로벌 옵션을 설정할 수도 있습니다.
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
또, 사용하실 수 있습니다.
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
만약 잭슨이 2+(1.9.5)보다 낮은 버전을 사용하고 있다면, 이 주석을 클래스 위에 쉽게 사용할 수 있습니다.속성에는 지정되지 않고 클래스 차이만 지정됩니다.
를 추가해야 합니다.import com.fasterxml.jackson.annotation.JsonInclude;
더하다
@JsonInclude(JsonInclude.Include.NON_NULL)
POJO 위에
네스트된 POJO가 있는 경우
@JsonInclude(JsonInclude.Include.NON_NULL)
모든 값을 추가해야 합니다.
메모: JAXRS(Jersey)는 이 시나리오 2.6 이상을 자동으로 처리합니다.
잭슨 2.x의 경우
@JsonInclude(JsonInclude.Include.NON_NULL)
운동장 바로 전에
최근 버전 2.6.6에서도 비슷한 문제가 발생했습니다.
@JsonInclude(JsonInclude.Include.NON_NULL)
필드 또는 클래스 레벨에서 위의 주석을 사용하는 것이 예상대로 작동하지 않았습니다.POJO는 내가 주석을 적용한 곳에서 변이할 수 있었다.내가 POJO의 행동을 불변의 것으로 바꾸었을 때, 그 주석은 마법을 부렸다.
이 lib의 새로운 버전인지 이전 버전인지는 모르겠지만 2.6.6의 경우 주석이 작동하려면 불변의 POJO가 필요합니다.
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
위의 옵션은 Object Mapper에 직접 시리얼라이제이션 포함을 설정하는 다양한 답변에서 언급되었지만, 저는 클래스 또는 파일 수준에서 제어하는 것을 선호합니다.
따라서 JSON 시리얼라이제이션 중에 모든 null 필드를 무시하려면 클래스 수준에서 주석을 사용하고 클래스에서 무시되는 필드가 적은 경우에는 해당 특정 필드에 주석을 사용합니다.이렇게 하면 특정 응답에 대한 동작을 변경하고 싶을 때 보다 읽기 쉽고 유지보수가 용이합니다.
GSON [ https://code.google.com/p/google-gson/ ]를 사용하여 이러한 늘필드가 자동으로 삭제됩니다.
샘플 DTO.java
public class SampleDTO {
String username;
String email;
String password;
String birthday;
String coinsPackage;
String coins;
String transactionId;
boolean isLoggedIn;
// getters/setters
}
Test.java
import com.google.gson.Gson;
public class Test {
public static void main(String[] args) {
SampleDTO objSampleDTO = new SampleDTO();
Gson objGson = new Gson();
System.out.println(objGson.toJson(objSampleDTO));
}
}
출력:
{"isLoggedIn":false}
gson-2.2.4 사용
부울 유형을 시리얼라이제이션에서 제외하려면 아래 코드를 사용하면 도움이 될 수 있습니다.
@JsonInclude(JsonInclude.Include.NON_ABSENT)
언급URL : https://stackoverflow.com/questions/16089651/jackson-serialization-ignore-empty-values-or-null
'itsource' 카테고리의 다른 글
| vue.js는 App에서 루트 이름을 가져옵니다.표시하다 (0) | 2022.08.28 |
|---|---|
| Vue 소품 데이터가 하위 구성 요소에서 업데이트되지 않음 (0) | 2022.08.28 |
| Vue 컴포넌트를 로컬로 등록하는 이점은 무엇입니까? (0) | 2022.08.27 |
| 하위 구성 요소에 Vue Prop가 정의되지 않았습니다. (0) | 2022.08.27 |
| Vue.js 어레이에서 항목을 삭제하는 방법 (0) | 2022.08.27 |