Gson是Google的开源库,用于将Java对象序列化和反序列化为JSON。
我存储在字符串中的json结构是: { “0”:{ "PDate": "2019-02-25 00:00:00.0000000", "DDate": "2019-06-25 00:00:00.0000000", “文件”:“FC”, ...
这是我第一次尝试使用java访问谷歌表格。我遵循了有关如何阅读和写作的谷歌教程。现在,我在运行 g 提供的代码片段时遇到问题...
我有一个具有以下属性的对象。 私有最终字符串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();
如何使用jsonschema2pojo-core将annotationStyle设置为Gson?
我正在使用 jsonschema2pojo-core 将 JSON 解析为 POJO。问题是我想将annotationStyle 设置为GSON。 (默认为杰克逊)。 任何想法? 非常感谢。
我需要序列化/反序列化特定的枚举: 公共枚举状态{ 在线(“在线”), 离线(“离线”), 未知(“德尔”){ @覆盖 公开
我需要序列化/反序列化特定的枚举: 公共枚举状态{ 在线(“在线”), 离线(“离线”), 未知(“德尔”){ @覆盖 公开
java Gson json格式化程序,是否可以输出Z而不是+0000?
我需要读入一些json,对其进行排序,然后再次输出。我用它来反序列化和序列化 json: 私有静态 Gson gson = new GsonBuilder() .setDateFormat("yy...
Gson、JSON 和 LinkedTreeMap 的微妙之处
我最近开始研究 JSON 字符串,并被告知 Google 自己的库 Gson 是处理这些字符串的新且时髦的方式。 我的理解是,JSON 字符串...
java.lang.SecurityException:无法使 java.lang.reflect.Method 构造函数可访问
我使用的是Gson 2.8.2版本 我使用了下面的代码 公共无效saveObject(查看视图){ SharedPreferences 首选项 = this.getSharedPreferences( “com.example.app”,上下文。
我正在考虑在我的项目中使用 Gson。在审查其功能时,出现了有关其并发处理的问题。 Gson 在实现过程中如何处理潜在的并发问题...
我正在尝试使用 Retrofit2 从每行一个流式传输 JSON 对象的 API 中进行消费。 响应看起来像这样 {“核心价值”, ...} {“关键”:“瓦...
为什么在启动 Spring Boot 应用程序时会出现 Gson 构建器错误?
我已经下载了eclipse并安装了spring套装进去。 我按照 spring.io 指南之一编写了一个基于 JPA 的 Rest 应用程序。当我尝试将其作为 Spring Boot 应用程序运行时...
Gson:参数被序列化,即使它有@Expose(serialize = false)
我正在为 JSON API 编写 SDK,但遇到了一个看似奇怪的问题。 API 在 POST 数据验证方面非常严格,并且不允许在启动时出现某些参数...
想象一下有一个 JSON 结构,其中包含客户购买的产品列表: { “产品密钥_1”:{ “名称”:“产品名称_1”, 「价格」:10.99...
设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象
当我使用时 构建类型{ 发布 { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
Log4j2:是否可以将映射消息值中的 JSON 字符串转换为事件输出中的结构化 JSON?
我们正在从自定义日志框架迁移到 Log4j2,并尝试尽可能匹配输出奇偶校验。 我们目前有一个日志语句,它通过 Map 接受多个参数,并且所有这些......
Android Kotlin Moshi:Moshi 的自定义适配器不起作用
我有一个 json 可以有两个可能的值 {"school.name": "学校名称"} 或者 {"name": "另一个学校名称"} 和我有一个共同的“学院”...
Android Kotlin:使用 Gson 将字符串序列化为 json 字符串
给定一个字符串,我想用Gson将其格式化为json字符串。 我期望从“email”得到“{”email”:“$email”}” 我显然可以做到 有趣
尝试使用 GSON 解析 JSON 字符串失败。我使用 JDK 8、GSON V2.10.1(使用 IntelliJ,还有 VS Code)并确定了错误的来源。相关代码片段如下...
我有以下文件夹结构: l_append --LogAppend.java --用户.java l_read --日志读取.java 生成文件 jar包 生成文件看起来像: LIBRARY_PATHS = gson.jar CLASS_FILES = l_append/LogAp...