1

当我将组件序列化为 JSON 时,它只输出已设置或具有默认值的属性。在我的示例中,您可以看到该属性phone没有被序列化。有没有办法改变 ColdFusion 中的这种行为?

用户.cfc:

component accessors="true" {
    property name="firstName";
    property name="lastName";
    property name="email" default="";
    property name="phone";
}

创建新用户,设置属性并序列化为 JSON:

var user = new User();
user.setFirstName("Homer");
user.setLastName("Simpson");
writeOutput(serializeJSON(user));

JSON 输出:

{"firstName":"Homer","email":"","lastName":"Simpson"}
4

2 回答 2

3

我想说你看到的是 ColdFusion 11 中的一个错误,所以你应该在bug tracker上相应地提出它。

幸运的是,ColdFusion 11 有一个(实现得相当糟糕,IMO)机制供您定义自己的组件序列化过程。

此功能的文档位于“支持可插入序列化程序和反序列化程序”,我在我的博客上进行了一些调查:“ ColdFusion 11:自定义序列化程序。问题多于答案”。

对于 Stack Overflow 的答案来说,如何实现这一点太冗长了,官方文档中都有详细记录。

于 2014-09-02T08:32:19.127 回答
1

以防其他人在 CF9 上处理这个问题,我解决问题的方法是使用来自https://mvnrepository.com/artifact/com.fasterxml.jackson.core的 Jackson(下载核心、注释和数据绑定) ,然后使用 JavaLoader 挂载 JAR:

    <Cfset var paths = []>
    <cfset paths[1] = expandPath("/api/v1/lib/jackson-core-2.0.0.jar")>
    <cfset paths[2] = expandPath("/api/v1/lib/jackson-annotations-2.0.0.jar")>
    <cfset paths[3] = expandPath("/api/v1/lib/jackson-databind-2.0.0.jar")>
    <cfset application.javaloader = createObject("component", "javaloader.JavaLoader").init(paths)>

然后从我的 CFC 给 Jackson 打电话:

    <cfset variables.jackson = application.jackson />
    <cfset var json = jackson.writeValueAsString(variables.data) />

请注意,您需要对 ColdFusion 中的变量进行 JavaCast 以获得正确的布尔值、数字和整数值(没有像内置序列化程序那样的自动输入。)Jackson 更快并且(尽管需要显式输入)比自定义序列化程序更可靠。

于 2016-08-08T23:02:07.283 回答