我正在使用Jackson将应用程序的REST接口序列化为JSON表示形式的POJO域对象。我想为某些类型自定义序列化,以将其他属性添加到POJO中不存在的JSON表示中(例如,添加一些元数据,参考数据等)。我知道如何编写自己的方法JsonSerializer
,但是在那种情况下,我需要为对象的
每个* 属性显式调用JsonGenerator.writeXXX(..)
方法,而我所需要的只是 添加
一个附加属性。换句话说,我希望能够编写如下内容:
***
@Override
public void serialize(TaxonomyNode value, JsonGenerator jgen, SerializerProvider provider) {
jgen.writeStartObject();
jgen.writeAllFields(value); // <-- The method I'd like to have
jgen.writeObjectField("my_extra_field", "some data");
jgen.writeEndObject();
}
或者(甚至更好)以某种方式在jgen.writeEndObject()
调用之前拦截序列化,例如:
@Override void beforeEndObject(....) {
jgen.writeObjectField("my_extra_field", "some data");
}
我以为可以扩展BeanSerializer
和覆盖它的serialize(..)
方法,但是已经声明了它final
,而且我也找不到一种简单的方法来创建一个新实例,BeanSerializer
而没有为它提供所有类型的元数据细节,而实际上却复制了杰克逊的大部分内容。所以我已经放弃了。
我的问题是
-如何自定义Jackson的序列化为特定POJO的JSON输出添加其他内容,而又不引入过多的样板代码以及尽可能多地重用默认的Jackson行为。
寻找更多的后 杰克逊
的源代码,我的结论是,这是根本不可能实现的,而不写我自己BeanSerializer
,BeanSerializerBuilder
和BeanSerializerFactory
并提供一些扩展点,如:
/*
/**********************************************************
/* Extension points
/**********************************************************
*/
protected void beforeEndObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
// May be overridden
}
protected void afterStartObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
// May be overridden
}
不幸的是,我不得不将整个 Jackson
的BeanSerializer
源代码复制并粘贴到其中,MyCustomBeanSerializer
因为前者不是为将所有字段和一些重要方法(如serialize(...)
)声明为扩展名而开发的。final
或者(甚至更好)在调用之前以某种方式截取序列化,例如: 我想我可以扩展并重写它的方法,但它被声明为,而且我找不到一种简单的方法来创建的新实例,而不为它提供所有类型元数据细节,这实际上是复制Jackson的一个很好的部分。所以我已经放弃了。 我的问题是-如何定制Jackson的序列化,为特定POJO向JSON输出添加额外的内容,而不引入太多的样板代码,并尽可能多地重用默认的Jackson行为。
问题:试图将JSON从http请求(Google方向)转换为POJO(只是我自己的类)。我现在已经有了“根”类“GoogleGeoCodeResponse”(文本中的GGCR,包含一些顶级字段,如status、routes等),其中还有一些其他字段(routes包含这个类和那个类,等等)。我要走了 尝试使用
问题内容: 我需要从Java pojo创建这样的Json有效负载: 所以我创建了一个Java pojo像这样: 我喜欢将Label类中的“ add”属性设置为动态,以便它也可以采用诸如“ remove”,“ set”之类的值。除了为每个人创建另一个POJO之外,还有其他方法吗? 问题答案: 您可以使用JsonAnyGetter批注来创建动态对。下面的示例显示了如何为同一类生成3个不同的键: 上面的
我很好奇Jackson如何创建对象,包括没有设置器的私有属性/字段,并且只使用对象空构造函数。 我之所以问这个问题,是因为当我反序列化某些属性时,我想根据这些值自动设置其他属性。例如,我不想序列化图像,只想序列化它的路径。路径反序列化后,字段Image可以加载实际图像。构造反序列化对象后,尚未分配字段。从逻辑上讲,getter没有被调用。那么是什么巫毒魔法在触摸我的物品的私人部分呢? 但是,当杰克
我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A
问题内容: 我知道如果文件User.json有 我可以像这样构造一个User对象: 但是,如果文件User.json具有以下内容,该如何构造对象列表: ? 问题答案: 多种方式:如果您具有这些的JSON数组,则可以执行以下操作: 或者,如果只是一系列根级别值,则可以执行以下操作: 并遍历值(添加到列表等)