gson是一个很棒的图书馆-运作良好。有时我有自定义要求,并且可以制作和注册TypeAdapters和TypeAdaptorFactories-效果也很好。
但是令我困惑的是如何委托回json序列化…大多数时候,我需要使用它进行收集,但为了说明这一点-
假设我有一个配对类,gson显然会很高兴地序列化,但是出于某种原因我需要自己的自定义序列化程序。好吧…如果我是
public class Pair
{
public final Object First;
public final Object Second;
public Pair( Object first, Object second) {this.first = first; this.second = second};
}
如果我为此编写了一个类型适配器-您可能 希望 write函数如下所示:
public void write( JsonWriter out, Pair pair )
{
out.beginObject();
out.name( "first");
out.value( pair.first ); // can't do this
out.name( "second");
out.value( pair.second); // or this
out.endObject();
}
因此,您可以看到问题-我 不知道 第一和第二的类型,也不知道它们如何序列化。我可以先使用gson.toJson进行序列化,然后再序列化-
但是,如果我将它们作为字符串添加到writer,它们将被转义。有一个gson.tojson函数需要一个值和一个writer-
但它也需要一个typetoken-我没有。我给人的印象是我打算从某个地方获得另一个类型适配器-
但是当我只拥有对象列表时,该从哪里得到呢?我只是获得对象的适配器?
我有点困惑吗?当然这是最常见的用例?大多数自定义序列化程序将用于T的奇怪列表或T的树或其他内容,并且您真的不知道列表中的内容,除了它继承自T
…因此,您需要能够将T委托给它。以某种方式进行序列化?
无论如何-如果有人可以告诉我如何编写上述功能,我将非常感谢!
在这种情况下,最好使用a
JsonSerializer
而不是a
TypeAdapter
,原因很简单,因为序列化程序可以访问其序列化上下文:
public class PairSerializer implements JsonSerializer<Pair> {
public PairSerializer() {
super();
}
@Override
public JsonElement serialize(final Pair value, final Type type,
final JsonSerializationContext context) {
final JsonObject jsonObj = new JsonObject();
jsonObj.add("first", context.serialize(value.getFirst()));
jsonObj.add("second", context.serialize(value.getSecond()));
return jsonObj;
}
}
上面的示例代码说明了如何将目标对象的序列化委派回主编组器。这样做的主要优点(除了避免复杂的解决方法)是,您仍然可以利用可能已经在主上下文中注册的其他类型的适配器和自定义序列化程序。请注意,序列化器和适配器的注册使用完全相同的代码:
// With adapter
final Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class,
new PairAdapter()).create();
// With serializer
final Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class,
new PairSerializer()).create();
如果发现需要使用适配器,则可以使用嵌入式Gson代理为您序列化Pair属性,其缺点是您无法访问在父Gson代理上进行的自定义注册:
public class PairAdapter extends TypeAdapter<Pair> {
final Gson embedded = new Gson();
public PairAdapter() {
super();
}
@Override
public void write(final JsonWriter out, final Pair value)
throws IOException {
out.beginObject();
out.name("first");
embedded.toJson(embedded.toJsonTree(value.getFirst()), out);
out.name("second");
embedded.toJson(embedded.toJsonTree(value.getSecond()), out);
out.endObject();
}
@Override
public Pair read(JsonReader in) throws IOException {
throw new UnsupportedOperationException();
}
}
然而,让我困惑的是,如何将委托返回到json序列化中...大多数时候,我需要这个集合,但为了说明这一点-假设我有一个pair类,gson显然会很高兴地序列化它,但出于某种原因,我需要自己的自定义序列化器。嗯...如果我的双是 如果我为此编写了一个类型适配器-您将希望write函数看起来如下所示: 所以你可以看到问题--我不知道第一个和第二个的类型,也不知道它们是如何序列化的。我可以使用gson.t
我正在使用谷歌Gson将Java对象序列化到JSON中。现在,我正在使用方法为一些类添加自定义序列化。通过使用这个,我需要将我想要序列化的所有类导入到我的项目中。 由于我正在处理一个项目,其中一个对象可以附加自定义类,所以我正在寻找一个解决方案,在这个解决方案中,我创建一个特定的方法(例如,),并告诉Gson在以默认模式序列化之前搜索该方法。 当Gson发现这个方法存在时,它会使用它,否则它会继续
我试图创建一个音频捕获活动,所以我从android文档中复制了这个类,如下所示 在我的xml页面中,我试图创建一个id为麦克风的RecordButton。类似这样的东西 现在,当我尝试运行该应用程序时,会出现以下输出
我对覆盆子皮和结节红很陌生。我想添加自定义节点到firebase使用节点-红色节点。下面是我的数据库截图: 我已经使用firebase节点的push选项来创建多个具有自动生成ID的节点。我想在node-red中使用firebase节点给出自定义ID,如“user1”、“user2”等。如何才能做到这一点。
问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将
我正在尝试用Y轴(垂直轴)做TimeSeriesChart,它有自定义标签。 我可以验证字符串('最终列表 请参阅这段代码。在初始化“最终标签”的地方,我有两行代码定义基本数字格式规范(BasicNumericTickFormatterSpec)。 第一行是我想做的。我想使用