Может ли gson десериализовать пустые строки как нули внутри карты? - PullRequest
1 голос
/ 08 апреля 2020

У меня удаленный API, отвечающий json, структурированный так:

{ 
  "something": 1234,
  "message": "abcde",
  "someKey": null,
  "Results": [
    {
     "key1": "",
     "key2": "some value here",
     "key3": ""
    }
  ]
}

Проблема в том, что возвращаются сотни этих пустых строковых значений, что затрудняет сортировку результатов. , Я пытался зарегистрировать и реализовать свой собственный JsonDeserializer, например:

    public static class EmptyStringAsNullTypeAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> {
        @Override
        public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) {
            if(StringUtils.isBlank(src.toString())) return null;
            return new JsonPrimitive(src.toString());
        }

        @Override
        public T deserialize(final JsonElement jsonElement, Type type, final JsonDeserializationContext context) throws JsonParseException {
            if ( jsonElement.isJsonPrimitive() ) {
                final JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();
                if ( jsonPrimitive.isString() && jsonPrimitive.getAsString().isEmpty() ) {
                    return null;
                }
            }
            return context.deserialize(jsonElement, type);
        }
    }
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(JsonElement.class, new EmptyStringAsNullTypeAdapter());
    // gsonBuilder.registerTypeAdapter(String.class, new EmptyStringAsNullTypeAdapter());  //tried this first
        Gson gson = gsonBuilder.create();

        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(jsonString);

        String prettyJson = gson.toJson(je);

Кажется, не имеет значения, что я здесь делаю, пользовательский десериализатор никогда не вызывается, а мой "симпатичный Json" всегда содержит пустые строки, которые я пытаюсь избежать. Я также попытался добавить пользовательский сериализатор, но он также никогда не вызывается. Может ли gson сделать то, что я хотел бы, и если да, то как?

Вот что я хочу:

{ 
  "something": 1234,
  "message": "abcde",
  "Results": [
    {
     "key2": "some value here",
    }
  ]
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Заменить это:

gsonBuilder.registerTypeAdapter(JsonElement.class, new EmptyStringAsNullTypeAdapter());

BY:

gsonBuilder.registerTypeAdapter(String.class, new EmptyStringAsNullTypeAdapter());
0 голосов
/ 08 апреля 2020

Вам нужно реализовать JsonSerializer, здесь вы снова сериализуете объект в строку.

...