【问题标题】:Changing names of properties while Serializing to JSON without source code在没有源代码的情况下序列化为 JSON 时更改属性名称
【发布时间】:2012-09-27 11:09:51
【问题描述】:

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

浏览了许多库(JacksonGson),但没有找到解决这个特殊问题的方法。它们中的大多数都是基于注释的,因为我没有源代码,所以我不能使用它们。

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

需要解决这个问题。如果已经实施和测试,那就更好了。

【问题讨论】:

  • 您可以为这些对象编写包装类。
  • 通过包装类,你的意思是,复制我的类中的每个属性,然后添加注释到相同的?
  • 是的。如果有太多的类,它可能不实用。检查Castor是否合适。

标签: java json serialization


【解决方案1】:

您还可以查看 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

【讨论】:

  • 感谢您的回答,会看看它,但我会使用它的机会很小......虽然这对其他人有帮助......
【解决方案2】:

找到问题的解决方案。

Google gson 有一个名为GsonBuilder 的类,它有exclusion strategynaming strategy 的方法。

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

完美运行,但不确定性能是否相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多