当前位置: 首页 > 知识库问答 >
问题:

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

亢胤运
2023-03-14

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

查看了许多库(Jackson、Gson),但没有找到一个解决这个特定问题的库。它们中的大多数是基于注释的,由于我没有源代码,我无法使用它们。

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

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

共有2个答案

拓拔坚
2023-03-14

找到了问题的解决方案。

Google gson有一个名为GsonBuilder的类,该类具有排除策略和命名策略的方法。

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

工作完美,但不确定相同的性能。

贝镜
2023-03-14

你也可以看看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。

    与属性重命名相同,您可以实现Property tyNameResolver并拥有完全控制权。

    最后,如果您想根据它们的修饰符过滤字段、方法或构造函数,您可以定义自己的VisiblityFilter。

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

    要开始使用Genson,您可以查看入门指南。

  •  类似资料:
    • 我已经从源代码处构建并安装了另一个glibc,并且我想让现有的用C++编写的可执行文件与自定义glibc一起运行,以供实验之用。为了做到这一点,我尝试更改可执行文件的加载程序。首先,在/lib64下创建了一个名为的链接,其路径指向新的加载程序 其次,通过文本编辑器修改了可执行文件中的加载器路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x8

    • 问题内容: 我的课有一个属性’PropertyA’,我希望它在序列化时在JSON对象中显示为’PropertyB’。我可以使用某种属性吗? 问题答案: 对于与使用: 确保您的课程也用属性修饰。 如果您使用的是JavaScriptSerializer,则需要创建派生的实现

    • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。

    • 问题内容: 我想要一种简单的,最好是基于注释的方式,将外部属性注入到Java程序中,而无需使用spring框架() SomeClass.java application.yml 在标准库中是否有建议的方法? 问题答案: 我最终使用apache commons配置: pom.xml: src /…/ PropertiesLoader.java /src/main/resources/applicat

    • 我有一堆CSV文件,它们是作为数据流读取的。对于每个dataframe,我希望更改一些列名,如果某个dataframe中存在特定列: column_name_update_map={'aa':'xx';'bb':'yy'}

    • 我在网站上做了一个小研究,并在这个网站上回顾了相关主题,但答案是矛盾的:有人说这是不可能的,有人说这是可能的,但很危险。 目标是传递匿名类的对象作为RMI方法的参数。由于RMI要求,这个类必须是可序列化的。这里没有问题,很容易使类序列化。 但是我们知道内部类的实例包含对外部类的引用(匿名类是内部类)。因此,当我们序列化内部类的实例时,外部类的实例也被序列化为一个字段。问题来了:外部类是不可序列化的