source

gson: null을 빈 문자열로 취급합니다.

manycodes 2023. 3. 7. 21:38
반응형

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);

Google 그룹의 답변

나도 같은 상황이었어.이 샘플이 도움이 되었습니다.

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

반응형