当前位置: 首页 > 知识库问答 >
问题:

gson:将空字符串视为null

颛孙英勋
2023-03-14

我使用gson序列化java对象到json。

Gson gson = new GsonBuilder().serializeNulls().create();

这个生成器处理好的空值。但与此同时,我希望它处理空字符串也为空。

这怎么能做到呢?

共有1个答案

和嘉澍
2023-03-14

您需要注册一个自定义TypeAdapter,该TypeAdapter包装现有的String TypeAdapter,并用JSON空值替换空字符串。

示例代码:

public static void main(String[] args) {
    Gson gson = createGson();
    System.out.println(gson.toJson(Arrays.asList("foo","bar","",null,"phleem")));
}

static Gson createGson() {
    return new GsonBuilder().serializeNulls()
                            .registerTypeAdapter(String.class,
                                                 new EmptyToNullTypeAdapter())
                            .create();

}

static class EmptyToNullTypeAdapter extends TypeAdapter<String> {

    @Override
    public void write(final JsonWriter out, final String value) throws IOException {
        if (value.isEmpty()) {
            out.nullValue();
        } else {
            TypeAdapters.STRING.write(out, value);
        }
    }

    @Override
    public String read(final JsonReader in) throws IOException {
        return TypeAdapters.STRING.read(in);
    }

}

输出:

[“foo”,“bar”,null,null,“freeem”]

警告

最后:不确定这是否是一个好主意,因为这是一个不对称的解决方案,也就是说,当您反序列化一个对象,然后再次序列化它时,您的新对象将不等于原始对象(空字符串而不是空字符串)。

 类似资料:
  • 我正在从Reddit API检索评论。该模型是线程化的,这样每个评论都可以在内部有一个评论列表,名为回复。下面是一个JSON响应的示例: 这是我如何用POJO建模的。上面的回复将被视为评论列表。 请注意底层CommentData POJO如何引用另一个名为“回复”的CommentList。 这个模型一直工作到GSON到达最后一个没有回复的子CommentData。API提供的不是空字符串,而是空字

  • 问题内容: 我使用google-gson将Java映射序列化为JSON字符串。它提供了一个生成器来处理null值: 问题在于结果是字符串,如: 所需的结果是: 我可以为和进行字符串替换,但这很难看并且容易出错。是否有本地gson支持添加自定义String而不是? 问题答案: 如果这是您的应用程序类型,则可以注册类型适配器。但是Gson不允许您更改字符串或原始类型的序列化形式。 最好的选择是更改Ja

  • 问题内容: 我知道它 确实 将’|’视为,但这并不能告诉我 为什么 会这样。据我了解的SQL规范,“ |”与-是一个有效的数据,而另一个则表明缺少相同的信息。 随意推测,但请说明是否是这种情况。如果有Oracle的任何人可以对此发表评论,那就太好了! 问题答案: 我相信答案是甲骨文非常老。 早在SQL标准出现以前,Oracle就做出了以下设计决定:/列中的空字符串是并且只有一种NULL感觉(有一些

  • 我有一个Android应用程序,与Spring开发的RESTAPI联系。应用程序很好地序列化了一个对象,但是Spring应用程序在每个字段不为null时将其解析为null。有什么不对劲?我该怎么办? 这是REST API方法签名:cambioPassword(@quiestHeader(授权)字符串头,PasswordChange userData) 注意:应用程序和API都使用Gson(我没有在

  • 问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么

  • 我有以下由Jackson映射的类(简化版): 在某些情况下,服务器返回,然后我想将name设置为空Java字符串。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串吗?