我正在尝试使用Jackson将对象序列化为JSON,以便字段名称基于一种字段。
我遇到与this线程中的OP相同的问题:
然而,它无法正常工作。
我正在使用Wildfly 10.1 Final
我做了以下事情:
resteasy-jackson2
提供了pom.xml
依赖项。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")
注释,因此我的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"}
因此, @JsonProperty 注释正在运行,但自定义JsonSerializer不是。
现在,我尝试了this博客中的建议,并在我的 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)
我无法发布完整的堆栈跟踪,因为它太长了。
有什么想法吗?
答案 0 :(得分:1)
您通过始终委托给相同(您的自定义)序列化程序创建了无限递归。第{
"from": 0,
"size": 50,
"query": {
"filtered": {
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "muc",
"fields": [
"name",
"sector.group.name",
"description",
"professionDescription"
]
}
},
{
"term": {
"alternate": "true"
}
},
{
"term": {
"flagDistance": "true"
}
}
],
"must": [],
"minimum_should_match": 2
}
},
"filter": {
"bool": {
"should": {
"geo_distance": {
"distance": "80km",
"institute.location": {
"lat": "48.866667",
"lon": "2.333333"
}
},
"term": {
"flagDistance": "true"
}
}
}
}
}
},
"track_scores": true,
"sort": {
"institute.premium": {
"order": "desc"
},
"_geo_distance": {
"location": {
"lat": "48.866667",
"lon": "2.333333"
}
}
}
}
行调用您的自定义序列化程序,以便序列化jgen.writeObjectField(value.getClass().getSimpleName(), value);
,再次调用Object
,依此类推。
您可以委派给另一个序列化程序或实际序列化该对象:
jgen.writeObjectField(...)