我正在尝试使用Jackson将对象序列化到JSON,以便字段名基于一种类型的字段。
我有和这个线程中的OP一样的问题:
然而,这并不奏效。
我正在使用Wildfly 10.1 Final
CustomSerializer类:
public class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeObjectField(value.getClass().getSimpleName(), value);
jgen.writeEndObject();
}
}
>
将@jsonProperty(“data”)
注释添加到object字段,因此我的Response类现在如下所示:
public class ResponseWithReturnValue extends Response {
@JsonProperty("data")
private Object object;
public ResponseWithReturnValue (int code, String msg) {
super(code, msg);
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
当我测试它时,我得到了以下json对象:
{"code":0,"message":"Success","data":"test"}
现在,我尝试了本博客中的建议,并在我的ResponseWithReturnValue类上添加了@jsonSerialize(using=CustomSerializer.class)
注释。
但是,现在我得到了这个StackOverflow:)异常:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Class.getEnclosingMethodInfo(Class.java:1072)
at java.lang.Class.getEnclosingClass(Class.java:1272)
at java.lang.Class.getSimpleBinaryName(Class.java:1443)
at java.lang.Class.getSimpleName(Class.java:1309)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
我无法发布完整的stacktrace,因为它太长了。
有什么想法吗?
通过始终委托给相同的(自定义的)序列化程序,您已经创建了无限递归。行jgen.writeobjectfield(value.getClass().getSimplename(),value);
调用自定义序列化程序,以序列化object
,后者再次调用jgen.writeobjectfield(...)
等等。
您可以委托给另一个序列化程序或实际序列化对象:
jgen.writeObjectFieldStart("objectFieldName");
jgen.writeStringField("someValue", value.getSomeValue());
//...
jgen.writeEndObject();
问题内容: 我以下列方式使用ModelMapper: 我有一些转换器类是Spring组件,它们注册了自定义ModelMapper映射 但是当Spring启动时出现以下错误,因为配置函数被调用并且源为null。 那应该如何工作? 我使用错了吗? 像这样声明bean,并且Foo和FooModel不是最终的 重要编辑 实际上,即使当我在主类中的函数中显式创建映射时,我也会得到相同的NullPointer
我编写了以下来让Jackson将一个数组的整数序列化为JSON: 此处使用该类: 我想测试序列化程序的行为,并得出以下结论: 但是,不向写入任何内容。我做错了什么?
问题内容: 我创建了一个自定义SSLSocketFactory类,并将其设置如下 从Eclipse Dev Environment运行并在命令提示符下将其作为Jar文件运行时,它可以正常工作。但是,当我将其包装在服务包装中并作为Windows Service启动时,它不起作用。我收到以下异常, 任何帮助??? 问题答案: 自从我发布此问题以来已经很长时间了。由于这篇文章没有任何答案,而且似乎也有一
Jackson序列化到JSON有一些很好的特性,比如SerializationFeature.write_null_map_values,它允许您避免将null写入序列化对象。 但是,如果我使用自定义的JsonSerializer,这个设置将被忽略,并且我被迫在对WriteStringField的所有调用中进行空检查。例如,我注册了一个自定义的JSONSerializer: 然后在ImportPr
问题内容: 我正在使用以下时间戳格式: 以下方法可以正常工作: 而且,当我使用该格式字符串传递时间戳时,它返回,例如: 然后,我需要再次从该字符串映射到时间戳,本质上是相反的操作。我知道我可以使用和及其方法,但是如果可能的话,我宁愿坚持使用样式格式。 我写了这段代码(相当hacky),它适用于某些格式,但不适用于特定格式: 在第二部分,它失败了。 堆栈跟踪: 有没有一种更简单的方法可以在不利用我的
我还更新了相关的XML文件,其中提到了spring security bean。我在用Postgres数据库。而且,在我的系统中,一切都运行良好,当我将这些更改提交到QA环境时,登录不工作。我在登录到应用程序时检查了日志,它显示了一些错误。这是日志 还有,如何检查ubuntu服务器中的PostgreSQL JDBC驱动程序版本?有人能帮我解决这个问题吗?谢谢