在没有源代码的情况下序列化为JSON时更改属性的名称

时间:2012-09-27 11:09:51

标签: java json serialization

需要在执行压缩(例如名称更改,排除等)时将java对象序列化为JSON。对象使用jar中的类,其源代码不可用。

查看了许多库(JacksonGson),但没有找到解决此特定问题的库。其中大多数是基于注释的,我不能使用,因为我没有源代码。

解决这个问题的一种方法是,使用反射并递归遍历对象,直到找到应该替换的属性名称或者在序列化的JSON中排除对象。

需要解决方案。如果它已经实施和测试,那就更好了。

2 个答案:

答案 0 :(得分:2)

您还可以查看Genson图书馆http://code.google.com/p/genson/

您可以使用非常简洁的代码重命名和过滤:

// renames all "fieldOfName" to "toName", excludes from serialization 
// and deserialization fields named "fieldNamed" and declared in DefinedInClass
// and uses fields with all visibility (protected, private, etc)

Genson genson = new Genson.Builder().rename("fieldOfName", "toName")
                                    .exclude("fieldNamed", DefinedInClass.class)
                                    .setFieldFilter(VisibilityFilter.ALL)
                                    .create();

genson.serialize(myObject);
  • 如果您想进行更复杂的过滤(例如,基于注释),您可以实施BeanMutatorAccessorResolver或扩展BaseResolver

  • 对于属性重命名,您可以实施PropertyNameResolver并完全控制。

  • 最后,如果您想根据修改器过滤字段,方法或构造函数,您可以定义自己的VisiblityFilter

  • 关于过滤/重命名的性能应该没有问题,因为每个类只执行一次然后缓存。

要开始使用Genson,您可以查看Getting Started Guide

答案 1 :(得分:0)

找到问题的解决方案。

Google gson有一个名为GsonBuilder的课程,其中包含exclusion strategynaming strategy的方法。

使用这两种方法实现了一个自定义解决方案,其中所有映射和排除规则都是使用xml存储的,并在序列化和反序列化时使用。

完美地运作,但不确定它的表现。