【问题标题】:Can gson deserialize empty strings as nulls inside a map?gson 可以将空字符串反序列化为地图中的空值吗?
【发布时间】:2020-04-08 07:26:40
【问题描述】:

我有一个远程 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);

我在这里做什么似乎并不重要,自定义反序列化器永远不会被调用,我的“prettyJson”总是包含我试图避免的空字符串。我也尝试过添加自定义序列化程序,但它也永远不会被调用。 gson 可以在这里做我想做的事情吗?如果可以,怎么做?

这就是我想要的:

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

【问题讨论】:

    标签: java json gson json-deserialization


    【解决方案1】:

    您需要在此处实现JsonSerializer,您将再次序列化字符串中的对象。

    【讨论】:

    • 对不起,我没有在我的问题中包含我所有的代码迭代......请在我更新的问题中查看我已经尝试过这个。当我尝试解析为 JsonObject 或 JsonElement 时,序列化器和反序列化器都不会被调用。如果我反序列化然后使用 POJO 进行序列化,我正在做的事情确实有效,但如果我可以使用 JsonElement,它会让我的生活更轻松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多