Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JACKSON对JSON数据进行内联序列化的最佳方法是什么?_Java_Json_Jackson - Fatal编程技术网

Java 使用JACKSON对JSON数据进行内联序列化的最佳方法是什么?

Java 使用JACKSON对JSON数据进行内联序列化的最佳方法是什么?,java,json,jackson,Java,Json,Jackson,我有一个定义如下的bean: 公共静态类TestBean{ 私人字符串a; 私人长b; 公共TestBean(字符串a,长b){ 这个a=a; 这个.b=b; } 公共字符串getA(){ 返回a; } 公共长getB(){ 返回b; } } 它对一些业务进行了建模,而我无法实例化它(使用JPA)。我的一些API允许用户使用Jackson(通过JAX-RS)将这个bean的视图序列化为JSON,我想向这个视图添加一个相关链接列表 正常的Jackson-JSON序列化是(对于a=“aa”和b=2

我有一个定义如下的bean:

公共静态类TestBean{
私人字符串a;
私人长b;
公共TestBean(字符串a,长b){
这个a=a;
这个.b=b;
}
公共字符串getA(){
返回a;
}
公共长getB(){
返回b;
}
}
它对一些业务进行了建模,而我无法实例化它(使用JPA)。我的一些API允许用户使用Jackson(通过JAX-RS)将这个bean的视图序列化为JSON,我想向这个视图添加一个相关链接列表

正常的Jackson-JSON序列化是(对于a=“aa”和b=2L):

我希望链接显示为

{"a":"aa","b":2,
 "links":[{"rel":"rel","href":"href://"},{"rel":"rel2","href":"href://2"}]}
可能的解决办法 我不希望向bean中添加getLinks()方法,它是特定于此视图的

简单地使用复合对象将产生如下序列化:

{"data":{"a":"aa","b":2},"links":[{"rel":"rel","href":"href://"}]}
我可以忍受,但最终不是我想要的

当前解决方案 我希望避免操纵JSON字符串或将其重新加载到映射中以插入额外的值。目前,我提出的解决方案似乎非常复杂:

当前的解决方案:

//复合视图对象
公共抽象类AddedLinksView{
私有最终K资源;
私有最终链接[]链接;
公共添加链接视图(K资源){
这个资源=资源;
链接=构建链接(资源);
}
公共摘要链接[]构建链接(K资源);
公共K getResource(){
返回资源;
}
公共链接[]获取链接(){
返回链接;
}
}
//特定的bean序列化程序
私有静态类RawBeanSerializer扩展了BeanSerializer{
公共生大豆发酵剂(大豆发酵剂){
超级(ser);
}
//这类似于标准序列化,但没有开始和结束标记
public void rawSerialize(对象bean、JsonGenerator jgen、SerializerProvider提供程序)引发IOException,
JsonGenerationException{
如果(_propertyFilterId!=null){
序列化字段过滤(bean、jgen、提供者);
}否则{
序列化字段(bean、jgen、provider);
}
}
}
@试验
public void usingModule()引发异常{
//基本模块元数据仅包括名称和版本(两者都用于故障排除;但名称必须唯一)
SimpleModule=新的SimpleModule(“EnhancedDateModule”,新版本(0,1,0,“alpha”);
//为复合视图添加序列化程序
addSerializer(新的JsonSerializer(){
@凌驾
公共类handledType(){
返回AddedLinksView.class;
}
@凌驾
public void serialize(AddedLinksView值、JsonGenerator jgen、SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writeStartObject();
//查找将用于我的资源的bean序列化程序
JsonSerializer ser=provider.findTypedValueSerializer(value.getResource().getClass(),true,
无效);
if(BeanSerializerBase的ser实例){
//将其克隆到一个子类中,从而可以“内联”序列化
RawBeanSerializer openSer=新的RawBeanSerializer((BeanSerializerBase)ser);
openSer.rawSerialize(value.getResource(),jgen,provider);
}
//添加我的链接
jgen.writeArrayFieldStart(“链接”);
for(Link:value.getLinks()){
jgen.writeObject(链接);
}
jgen.writeEndArray();
jgen.writeEndObject();
}
});
ObjectMapper mapper=新的ObjectMapper();
映射器注册表模块(模块);
AddedLinksView视图=新的AddedLinksView(新的TestBean(“aa”,2L)){
@凌驾
公共链接[]构建链接(TestBean资源){
返回新链接[]{新链接(“rel”,“href://”),新链接(“rel2”,“href://”)};
}
};
System.out.println(“useModule json输出:”+mapper.writeValueAsString(视图));
}

我是不是错过了杰克逊身上一些显而易见的东西?还是我的要求已经完全偏离了标准?

这能回答你的问题吗:

我不确定您是否可以避免映射。你可以用推土机帮忙


这应该会对您有所帮助:

没有真正的方法将东西从外部注入POJO中进行序列化:但是您可能对签出
@JsonAnyGetter
感兴趣,这至少允许将
java.util.Map
的内容添加为POJO的额外属性。

我希望避免合并bean,这位国王过去的经历相当糟糕。至于它似乎可以让你用JSON编码的属性更新一个已经存在的bean,我想做的是在序列化时添加额外的属性。这里有一点:我会坚持使用我当前的解决方案,因为它不会在我的模型上添加jackson依赖项。但当我越过这条线的那一天,我可能会放弃一切,使用这个@JsonAnyGetter.Sure。只需确保阅读有关混合注释(wiki.fasterxml.com/jacksonmixinnotations)的内容,因为这样就不需要在POJO中添加任何Jackson类型(当然,仍然需要使用“any getter”方法)
{"data":{"a":"aa","b":2},"links":[{"rel":"rel","href":"href://"}]}