ColdFusion不会将所有属性序列化为JSON

时间:2014-09-02 06:00:25

标签: coldfusion cfc coldfusion-11

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

User.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"}

2 个答案:

答案 0 :(得分:3)

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

幸运的是,ColdFusion 11有一个(相当糟糕的IMO)机制,可以为组件定义自己的序列化过程。

此功能的文档位于“Support for pluggable serializer and deserializer”,我在此处对我的博客进行了一些调查:“ColdFusion 11: custom serialisers. More questions than answers”。

如何实现这一点对于Stack Overflow答案而言太过冗长,并且在官方文档中都有详细记录。

答案 1 :(得分:1)

以防其他人在CF9上处理这个问题,我解决问题的方法是使用Jackson(下载核心,注释和数据绑定)来自https://mvnrepository.com/artifact/com.fasterxml.jackson.core),然后使用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调用杰克逊:

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

请注意,您需要JavaCast来自ColdFusion的变量才能获得正确的布尔值,数值和整数值(不像内置的序列化程序那样自动输入。)杰克逊要快得多(尽管明确了)需要输入)比自定义序列化器更可靠。