gson 相关问题

Gson是Google的开源库,用于将Java对象序列化和反序列化为JSON。

向共享首选项中保存的 json 添加新参数

在我的 Android 应用程序中,将自定义数据类转换为 json 字符串后,我将其保存为共享首选项。在新版本中,我需要在此处的数据类中添加一个新参数并更改...

回答 1 投票 0

如何使用 Retrofit 使用 GSON 解析来自 API 的 JSON 数组?

.嗨! 这是 API 响应: [ { “id”:1, “名称”:“脸书” }, { “id”:2, “名称”:“愤怒的小鸟&...

回答 1 投票 0

Gson 未使用的列表的自定义 JsonDeserializer

我在反序列化方面遇到问题。我从服务器得到这个 json { “房间”:[ { “id”:1, “名称”:“Стандартный номер с видом на бассейн”,...

回答 1 投票 0

Json反序列化器Gson

我在反序列化方面遇到问题。我从服务器得到这个 json { “房间”:[ { “id”:1, “名称”:“Стандартный номер с видом на бассейн”,...

回答 1 投票 0

如何使用GSON取消实现json?出现错误

我存储在字符串中的json结构是: { “0”:{ "PDate": "2019-02-25 00:00:00.0000000", "DDate": "2019-06-25 00:00:00.0000000", “文件”:“FC”, ...

回答 3 投票 0

未找到 JsonReader 类

这是我第一次尝试使用java访问谷歌表格。我遵循了有关如何阅读和写作的谷歌教程。现在,我在运行 g 提供的代码片段时遇到问题...

回答 1 投票 0

如何使用Gson序列化Optional<T>类?

我有一个具有以下属性的对象。 私有最终字符串messageBundle; 私有最终列表 messageParams; 私有最终字符串actionBundle; 私人最终地图 我有一个具有以下属性的对象。 private final String messageBundle; private final List<String> messageParams; private final String actionBundle; private final Map<String, String> data; private final Optional<Pair<Integer,TimeUnit>> ttl; private final Optional<Integer> badgeNumber; private final Optional<String> collapseKey; 该对象位于库中,我宁愿不为了序列化目的而修改它,并且希望避免创建另一个 DTO 的成本。 如何序列化/反序列化可选属性? Optional 没有默认构造函数(apache commons Pair 也没有),但我无法使用 InstanceCreator,并且并不真正了解如何创建一个 TypeAdapter 来简单地将序列化委托给底层的Optional内容。 经过几个小时的搜索和编码 - 这是我的版本: public class OptionalTypeAdapter<E> extends TypeAdapter<Optional<E>> { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Class<T> rawType = (Class<T>) type.getRawType(); if (rawType != Optional.class) { return null; } final ParameterizedType parameterizedType = (ParameterizedType) type.getType(); final Type actualType = parameterizedType.getActualTypeArguments()[0]; final TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(actualType)); return new OptionalTypeAdapter(adapter); } }; private final TypeAdapter<E> adapter; public OptionalTypeAdapter(TypeAdapter<E> adapter) { this.adapter = adapter; } @Override public void write(JsonWriter out, Optional<E> value) throws IOException { if(value.isPresent()){ adapter.write(out, value.get()); } else { out.nullValue(); } } @Override public Optional<E> read(JsonReader in) throws IOException { final JsonToken peek = in.peek(); if(peek != JsonToken.NULL){ return Optional.ofNullable(adapter.read(in)); } in.nextNull(); return Optional.empty(); } } 您可以像这样简单地使用GsonBuilder注册它: instance.registerTypeAdapterFactory(OptionalTypeAdapter.FACTORY) 请注意,如果 json 中不存在字段,Gson 不会为您的类字段设置值。所以你需要在你的实体中设置默认值Optional.empty()。 Ilya 的解决方案忽略了类型参数,因此它在一般情况下无法真正工作。我的解决方案相当复杂,因为需要区分 null 和 Optional.absent() - 否则你可以将封装作为列表剥离。 public class GsonOptionalDeserializer<T> implements JsonSerializer<Optional<T>>, JsonDeserializer<Optional<T>> { @Override public Optional<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final JsonArray asJsonArray = json.getAsJsonArray(); final JsonElement jsonElement = asJsonArray.get(0); final T value = context.deserialize(jsonElement, ((ParameterizedType) typeOfT).getActualTypeArguments()[0]); return Optional.fromNullable(value); } @Override public JsonElement serialize(Optional<T> src, Type typeOfSrc, JsonSerializationContext context) { final JsonElement element = context.serialize(src.orNull()); final JsonArray result = new JsonArray(); result.add(element); return result; } } 作为maaartinus解决方案的补充,没有封装列表的版本,其中Optional.absent简单地序列化为null: public class GsonOptionalDeserializer<T> implements JsonSerializer<Optional<T>>, JsonDeserializer<Optional<T>> { @Override public Optional<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final T value = context.deserialize(json, ((ParameterizedType) typeOfT).getActualTypeArguments()[0]); return Optional.fromNullable(value); } @Override public JsonElement serialize(Optional<T> src, Type typeOfSrc, JsonSerializationContext context) { return context.serialize(src.orNull()); } } 我将添加到Anton Onikiychuk的答案 @Override public Optional<E> read(JsonReader in) throws IOException { JsonToken peek = in.peek(); if (peek == JsonToken.NULL) { in.nextNull(); // consuming JSON null return Optional.empty(); } return Optional.ofNullable(adapter.read(in)); } 在尝试为 java.util.Optional 等可选类型创建自定义 Gson TypeAdapter 时,我遇到了类似的挑战。尽管进行了广泛的搜索并审查了现有的答案,但我找不到精确解决此问题的解决方案。 但是,经过彻底的实验,我成功创建了一个适合您的场景的自定义 TypeAdapter: /** * TypeAdapter to manage nullable fields with Optional approach */ public static class OptionalTypeAdapter<E> implements JsonSerializer<Optional<E>>, JsonDeserializer<Optional<E>> { @Override public JsonElement serialize(Optional<E> src, Type typeOfSrc, JsonSerializationContext context) { if (src.isPresent()) { return context.serialize(src.get()); } else { return JsonNull.INSTANCE; } } @Override public Optional<E> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.isJsonNull()) { return Optional.empty(); } else { E value = context.deserialize(json, ((ParameterizedType) typeOfT).getActualTypeArguments()[0]); return Optional.ofNullable(value); } } } 这个自定义的OptionalTypeAdapter应该允许Gson在序列化和反序列化中适当地处理可选类型。 现在可以通过以下代码实例化 Gson 对象来处理 JSON: new GsonBuilder() .registerTypeAdapter(Optional.class, new OptionalTypeAdapter<>()) .create();

回答 5 投票 0

如何使用jsonschema2pojo-core将annotationStyle设置为Gson?

我正在使用 jsonschema2pojo-core 将 JSON 解析为 POJO。问题是我想将annotationStyle 设置为GSON。 (默认为杰克逊)。 任何想法? 非常感谢。

回答 2 投票 0

如何使用Gson序列化/反序列化枚举

我需要序列化/反序列化特定的枚举: 公共枚举状态{ 在线(“在线”), 离线(“离线”), 未知(“德尔”){ @覆盖 公开

回答 3 投票 0

如何使用 Gson 序列化/反序列化枚举

我需要序列化/反序列化特定的枚举: 公共枚举状态{ 在线(“在线”), 离线(“离线”), 未知(“德尔”){ @覆盖 公开

回答 3 投票 0

java Gson json格式化程序,是否可以输出Z而不是+0000?

我需要读入一些json,对其进行排序,然后再次输出。我用它来反序列化和序列化 json: 私有静态 Gson gson = new GsonBuilder() .setDateFormat("yy...

回答 1 投票 0

Gson、JSON 和 LinkedTreeMap 的微妙之处

我最近开始研究 JSON 字符串,并被告知 Google 自己的库 Gson 是处理这些字符串的新且时髦的方式。 我的理解是,JSON 字符串...

回答 5 投票 0

java.lang.SecurityException:无法使 java.lang.reflect.Method 构造函数可访问

我使用的是Gson 2.8.2版本 我使用了下面的代码 公共无效saveObject(查看视图){ SharedPreferences 首选项 = this.getSharedPreferences( “com.example.app”,上下文。

回答 3 投票 0

此文件中如何处理同步问题?

我正在考虑在我的项目中使用 Gson。在审查其功能时,出现了有关其并发处理的问题。 Gson 在实现过程中如何处理潜在的并发问题...

回答 1 投票 0

retrofit2 解析多行 json 响应

我正在尝试使用 Retrofit2 从每行一个流式传输 JSON 对象的 API 中进行消费。 响应看起来像这样 {“核心价值”, ...} {“关键”:“瓦...

回答 1 投票 0

为什么在启动 Spring Boot 应用程序时会出现 Gson 构建器错误?

我已经下载了eclipse并安装了spring套装进去。 我按照 spring.io 指南之一编写了一个基于 JPA 的 Rest 应用程序。当我尝试将其作为 Spring Boot 应用程序运行时...

回答 7 投票 0

Gson:参数被序列化,即使它有@Expose(serialize = false)

我正在为 JSON API 编写 SDK,但遇到了一个看似奇怪的问题。 API 在 POST 数据验证方面非常严格,并且不允许在启动时出现某些参数...

回答 4 投票 0

仅关心 JSON 键时利用 Gson 的最佳方法?

想象一下有一个 JSON 结构,其中包含客户购买的产品列表: { “产品密钥_1”:{ “名称”:“产品名称_1”, 「价格」:10.99...

回答 1 投票 0

设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象

当我使用时 构建类型{ 发布 { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }

回答 2 投票 0

Log4j2:是否可以将映射消息值中的 JSON 字符串转换为事件输出中的结构化 JSON?

我们正在从自定义日志框架迁移到 Log4j2,并尝试尽可能匹配输出奇偶校验。 我们目前有一个日志语句,它通过 Map 接受多个参数,并且所有这些......

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.