2

当我有这样的实体时

class Foo
{
   private String Bar = "someBarValue";
}

和以下声明

String json = new Gson().toJson(new Foo());

结果是{ "bar" : "someBarValue"}

我有很多遵循标准 java bean 约定的类

class FooBean
{
    String getBar() { return "someBarValue"; }
}

和以下声明

String json = new Gson().toJson(new FooBean());

结果是{}

如何FooBean使用 Gson 从上面的示例中序列化(如果我有设置器,最终反序列化),而不必依赖类的私有成员变量?

4

1 回答 1

4

这在今天是不可能的。看看Gson 设计文档

使用字段与 getter 来指示 Json 元素

一些 Json 库使用类型的 getter 来推断 Json 元素。我们选择使用非瞬态、静态或合成的所有字段(在继承层次结构上)。我们这样做是因为并非所有类都是用适当命名的 getter 编写的。此外,getXXX 或 isXXX 可能是语义而不是指示属性。

但是,也有很好的论据来支持属性。我们打算在后一个版本中增强 Gson 以支持属性作为指示 Json 字段的替代映射。目前,Gson 是基于字段的。

您可能会考虑的另一件事是序列化/反序列化的概念:为什么要序列化/反序列化一个对象?一般来说,在持久化、通信(即主要是I/O)之后拥有它的副本。不依赖 getter 和 setter 这样做是有道理的。它们可能会更改对象的内容,因此序列化/反序列化将无法实现它们的构建目的。

于 2013-03-02T21:40:13.770 回答