Mule 4:如何将自定义Java对象正确转换为JSON?
问题描述
我有如下自定义Java对象类:
package com.me; public class Person { String firstName; String lastName; public String toString(){ return "{firstName=" + this.firstName + ",lastName=" + this.lastName + "}"; } }
我希望将JSON负载转换为该对象,再转换回JSON。为此,我使用DataWeave及以下转换消息处理器:
%dw 2.0 output application/java --- { "firstName": "Mickey", "lastName": "Mouse", } as Object {class : "com.me.Person"}
此操作返回已更新姓名的对象。之后,我尝试用以下脚本将其转换回JSON:
%dw 2.0 output application/json --- payload
但返回的是空JSON对象:
{}
请问应如何修改我的Java类,以得到如下格式的JSON负载?
{ "firstName": "Mickey", "lastName": "Mouse" }
解决方案
出现空JSON的原因是DataWeave依赖Jackson进行Java对象序列化,默认情况下Jackson无法访问包私有(默认权限)的firstName和lastName字段,也没有对应的Getter方法读取字段值,因此序列化时输出空对象。
你可以任选以下一种方式修改Java类:
方法1:添加Getter方法(推荐,符合JavaBean规范)
给字段添加标准的Getter方法,Jackson会自动通过这些方法读取字段值:
package com.me; public class Person { String firstName; String lastName; public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String toString(){ return "{firstName=" + this.firstName + ",lastName=" + this.lastName + "}"; } }
方法2:将字段设为public权限
直接开放字段的访问权限,让Jackson可以直接读取字段内容:
package com.me; public class Person { public String firstName; public String lastName; public String toString(){ return "{firstName=" + this.firstName + ",lastName=" + this.lastName + "}"; } }
方法3:使用Jackson注解标记可序列化字段
如果不想修改权限或添加Getter,可通过@JsonProperty注解显式告知Jackson要序列化这些字段:
package com.me; import com.fasterxml.jackson.annotation.JsonProperty; public class Person { @JsonProperty String firstName; @JsonProperty String lastName; public String toString(){ return "{firstName=" + this.firstName + ",lastName=" + this.lastName + "}"; } }
完成修改后,再用原DataWeave脚本转换即可得到目标JSON格式。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

