- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Genson 在 Java 中实现 JSON 序列化1.3 对于多态类型,包括:
数字
枚举
类下面的 SSCCE 大致展示了我想要实现的目标:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
/**
* A Short, Self Contained, Compilable, Example for polymorphic serialization
* and deserialization.
*/
public class GensonPolymoprhicRoundTrip {
// our example enum
public static enum RainState {
NO_RAIN,
LIGHT_RAIN,
MODERATE_RAIN,
HEAVY_RAIN,
LIGHT_SNOW,
MODERATE_SNOW,
HEAVY_SNOW;
}
public static class Measurement<T> {
public T value;
public int qualityValue;
public String source;
public Measurement() {
}
public Measurement(T value, int qualityValue, String source) {
this.value = value;
this.qualityValue = qualityValue;
this.source = source;
}
}
public static class DTO {
public List<Measurement<?>> measurements;
public DTO(List<Measurement<?>> measurements) {
this.measurements = measurements;
}
}
public static void main(String... args) {
Genson genson = new GensonBuilder()
.useIndentation(true)
.useRuntimeType(true)
.useClassMetadataWithStaticType(false)
.addAlias("RainState", RainState.class)
.useClassMetadata(true)
.create();
DTO dto = new DTO(
new ArrayList(Arrays.asList(
new Measurement<Double>(15.5, 8500, "TEMP_SENSOR"),
new Measurement<double[]>(new double[] {
2.5,
1.5,
2.0
}, 8500, "WIND_SPEED"),
new Measurement<RainState>(RainState.LIGHT_RAIN, 8500, "RAIN_SENSOR")
)));
String json = genson.serialize(dto);
System.out.println(json);
DTO deserialized = genson.deserialize(json, DTO.class);
}
}
数字和数组开箱即用,效果很好,但枚举类带来了一些挑战。在这种情况下,序列化的 JSON 表单必须是一个 JSON 对象,其中包括:
查看EnumConverter
类,我发现我需要提供一个自定义Converter
。但是我不太清楚如何正确注册 Converter
以便在反序列化期间调用它。如何使用 Genson 解决这个序列化问题?
最佳答案
非常适合提供完整的示例!
第一个问题是 DTO 没有无参数构造函数,但 Genson 即使具有带参数的构造函数也支持类。您只需通过构建器使用“useConstructorWithArguments(true)”启用它即可。
但是这并不能解决完整的问题。目前 Genson 仅对序列化为 json 对象的类型提供完整的多态支持。因为 Genson 会为其添加一个名为“@class”的属性。有一个open issue为此。
可能适用于大多数情况的最佳解决方案是定义一个自动将所有值包装在 json 对象中的转换器,以便处理类元数据的转换器能够生成它。在等待 Genson 正式支持时,这可能是一个“足够好”的解决方案。
所以首先定义包装转换器
public static class LiteralAsObjectConverter<T> implements Converter<T> {
private final Converter<T> concreteConverter;
public LiteralAsObjectConverter(Converter<T> concreteConverter) {
this.concreteConverter = concreteConverter;
}
@Override
public void serialize(T object, ObjectWriter writer, Context ctx) throws Exception {
writer.beginObject().writeName("value");
concreteConverter.serialize(object, writer, ctx);
writer.endObject();
}
@Override
public T deserialize(ObjectReader reader, Context ctx) throws Exception {
reader.beginObject();
T instance = null;
while (reader.hasNext()) {
reader.next();
if (reader.name().equals("value")) instance = concreteConverter.deserialize(reader, ctx);
else throw new IllegalStateException(String.format("Encountered unexpected property named '%s'", reader.name()));
}
reader.endObject();
return instance;
}
}
然后您需要将其注册到 ChainedFactory,这将允许您委托(delegate)给默认转换器(这样它就可以自动与任何其他类型一起工作)。
Genson genson = new GensonBuilder()
.useIndentation(true)
.useConstructorWithArguments(true)
.useRuntimeType(true)
.addAlias("RainState", RainState.class)
.useClassMetadata(true)
.withConverterFactory(new ChainedFactory() {
@Override
protected Converter<?> create(Type type, Genson genson, Converter<?> nextConverter) {
if (Wrapper.toAnnotatedElement(nextConverter).isAnnotationPresent(HandleClassMetadata.class)) {
return new LiteralAsObjectConverter(nextConverter);
} else {
return nextConverter;
}
}
}).create();
此解决方案的缺点是 useClassMetadataWithStaticType 需要设置为 true...但我想它是可以接受的,因为它是一个优化并且可以修复,但意味着 Gensons 代码中的一些更改,其余的仍然有效。
如果您对这个问题感兴趣,那么您尝试解决该问题并创建 PR 来提供此功能作为 Genson 的一部分就太好了。
关于java - Genson 多态/通用序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33568019/
基本上,我有一些 Java 对象,我希望将它们序列化为 JSON,并尽可能减少头痛。现在我使用 Tomcat、Jersey 和 Genson。 我发现这样的东西对 Genson 不起作用(当然,这是一
我使用 http://www.jsonschema2pojo.org/ 从 json 模板创建了一个类我使用 Genson 将我的 json 映射到基于 Jersey 的 WS。这是我的“json 类
好吧,正如标题所说,因为我尝试添加 Genson,它破坏了我的应用程序。现在我不能 100% 确定这与 Payara 有关,但阅读错误日志后可以肯定是与 Payara 有关。 我已将 Genson 添
我正在使用Genson将 Java 类序列化为 JSON。类成员之一是 Map,我需要将其直接序列化为名称/值对。例如: public class Demo { String name;
您好,我正在为我的 POJO 类使用 Genson 的 ser/de。但是在序列化具有字节字段的 POJO 时出现问题。我没有尝试反序列化同一对象。所以我不知道这是否也有效。日期字段也有问题。 这是我
我正在尝试使用 Genson 在 Java 中实现 JSON 序列化1.3 对于多态类型,包括: 数字 数组 枚举类 下面的 SSCCE 大致展示了我想要实现的目标: import java.util
我正在尝试使用 Genson 库在服务器和客户端之间执行通信。我检测到以下问题:尝试向服务器发送消息时,当服务器上的 genson 尝试读取消息时,我的应用程序停止运行。 同时,如果我关闭客户端,消息
我正在开发一个 Java servlet,我需要将一个类序列化和反序列化为 JSON 并返回。为此,我使用 Genson 库,但遇到了障碍。 Genson 无法反序列化 Date 类 (java.sq
我正在使用 Genson 将我的 Android 应用程序中的 json 序列化和反序列化为多态对象。尽管 JSON 来自各种来源,但我不能保证 @class 元数据将是 json 中的第一行项目。遍
我使用 Jersey 来实现 RESTful 服务,并使用 Genson 来执行 JSON/POJO 转换。 Genson 没有任何设置,我只是将它放入类路径中,它就可以工作,只是它会在日期解析时抛出
我最近升级到 Genson 1.3,我不能 100% 确定这个问题是否是新问题,因为之前我修补了 0.98 版本以使其正常工作。 上下文 我们正在使用我们自己的 BeanMutatorAccessor
对于我的 Genson 配置,我使用 UrlQueryParamFilter 。它有效,但不像我预期的那样。 我的实体: public class Root { private String
我正在尝试使用 Genson 将具有长 id 的对象序列化为 JSON。 如果我序列化为 JSON 然后返回 Java,效果会很好。但我正在 JavaScript 中进行反序列化。 JavaScrip
我在 Android 项目中遇到 proguard 配置问题。我正在使用 Genson 来解析传入的 JSON 数据。它速度很快,不需要额外的配置或反序列化器,因为在服务器端也有 Genson。 在
我正在尝试将 json 文档中的简单字符串元素数组转换为 java List,它位于使用 genson 的 bean 中。我期待这会自动发生,但它不起作用。我错过了什么吗? 这是我的 Json 字符串
我正在使用 JAX-RS( Jersey )和 Glassfish 作为服务器开发 RESTful Web 服务。我实现了返回实体列表的简单方法,当我尝试访问它时,服务器会抛出 500 错误 org.
我有一个基于 Jersey 框架的简单客户端。 我想使用 Genson 作为默认的 JSON 提供程序。 首先,我创建了一些实现了 ContextResolver 的类: @Provider publ
尝试使用 Jersey 和 Genson 执行 POST 调用时遇到以下问题: ....com.owlike.genson.JsonBindingException:未找到类型接口(interface
我在 REST 实现中使用 genson 1.4 进行 JSON 处理,使用 genson 时 JSON 继承不起作用。请查找下面的示例代码结构。 这是我的基础对象 This is my BaseOb
快速介绍(可以跳过):你好,关于这个话题有很多问题和答案,但有时解决方案很简单,你甚至都没有想到,因为我已经浪费了很多时间,所以我想发布一个补充所有答案。 问题:您有一个 JSON REST 服务来处
我是一名优秀的程序员,十分优秀!