gson: null을 빈 문자열로 취급합니다.
Google-gson을 사용하여 Java 맵을 JSON 문자열로 시리얼화합니다.빌더가 null 값을 처리할 수 있습니다.
Gson gson = new GsonBuilder().serializeNulls().create();
문제는 그 결과가 스트링이라는 것입니다.null
예를 들어 다음과 같습니다.
gson.toJson(categoriesMap));
{"111111111":null}
필요한 결과는 다음과 같습니다.
{"111111111":""}
스트링 치환을 할 수 있습니다.null
그리고.""
단, 이는 보기 흉하고 오류가 발생하기 쉽습니다.커스텀 스트링을 추가하기 위한 네이티브 gson 지원이 있습니까?null
?
위의 답변은 시리얼라이제이션에서는 정상적으로 동작합니다만, 시리얼라이제이션에서는 null 값을 가지는 필드가 있는 경우, Gson은 이 필드를 건너뛰고 타입 어댑터의 시리얼라이제이션 메서드를 입력하지 않기 때문에, 타입 어댑터 팩토리를 등록해 타입 어댑터를 반환할 필요가 있습니다.
Gson gson = GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
public static class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<T> rawType = (Class<T>) type.getRawType();
if (rawType != String.class) {
return null;
}
return (TypeAdapter<T>) new StringAdapter();
}
}
public static class StringAdapter extends TypeAdapter<String> {
public String read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return "";
}
return reader.nextString();
}
public void write(JsonWriter writer, String value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
}
실제 버전의 gson에서는 다음과 같이 할 수 있습니다.
Object instance = c.getConstructor().newInstance();
GsonBuilder gb = new GsonBuilder();
gb.serializeNulls();
Gson gson = gb.create();
String stringJson = gson.toJson(instance);
나도 같은 상황이었어.이 샘플이 도움이 되었습니다.
import java.lang.reflect.Type;
public class StringConverter implements JsonSerializer<String>,
JsonDeserializer<String> {
public JsonElement serialize(String src, Type typeOfSrc,
JsonSerializationContext context) {
if ( src == null ) {
return new JsonPrimitive("");
} else {
return new JsonPrimitive(src.toString());
}
}
public String deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
return json.getAsJsonPrimitive().getAsString();
}
}
용도:
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(String.class, new StringConverter());
Gson gson = gb.create();
애플리케이션 타입의 경우는, 타입 어댑터를 등록할 수 있습니다.하지만 Gson에서는 문자열이나 원시 유형의 직렬 형식을 변경할 수 없습니다.
Java 개체를 변경하는 것이 가장 좋습니다.또는 Null 주위의 제한을 완화합니다.
방법이 없어요.Gson's 페이지에서 발행했습니다.다음 버전에서 수정되기를 바랍니다.
나는 내가 해결할 수 있는 거의 같은 문제를 가지고 있었다.나도 이슈를 만들었다.
류보미르-샤이다리프로부터 이런 대답을 들었다.
Gson은 성능상의 이유와 단순성에 대한 결측값은 다루지 않습니다.영향을 받지 않는 늘 필드를 기본값으로 설정하는 후처리 유형 어댑터를 쉽게 구현할 수 있습니다.
원래 답변의 코드 조각을 바탕으로 유닛 테스트로 샘플 프로젝트를 작성했습니다.
언급URL : https://stackoverflow.com/questions/9483348/gson-treat-null-as-empty-string
'source' 카테고리의 다른 글
AngularJS에서 입력 필드의 첫 번째 문자를 자동 자본화하는 방법은 무엇입니까? (0) | 2023.03.07 |
---|---|
Oracle 11G에 SELECT 문 삽입 (0) | 2023.03.07 |
javascript에서 fetch()를 사용하여 JSON 파일을 읽는 방법은 무엇입니까? (0) | 2023.03.07 |
Jackson JsonNode에서 유형화된 컬렉션으로 (0) | 2023.03.07 |
키/값 테이블인 wp_postmeta에 대한 내부 조인을 많이 사용하여 쿼리 개선 (0) | 2023.03.07 |