ColdFusion没有';t将所有属性序列化为JSON

ColdFusion没有';t将所有属性序列化为JSON,coldfusion,cfc,coldfusion-11,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时,它只输出已设置或具有默认值的属性。在我的示例中,您可以看到属性
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"}

我想说,你看到的是ColdFusion 11中的一个bug,所以你应该在屏幕上相应地提高它

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

此功能的文档位于“”,我在这里的博客上进行了一些调查:“”


如何实现这一点对于堆栈溢出问题的答案来说太冗长了,官方文档中对此都有详细的说明。

我想说的是,您看到的是ColdFusion 11中的一个bug,因此您应该在Web上相应地提出它

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

此功能的文档位于“”,我在这里的博客上进行了一些调查:“”


如何实现这一点对于堆栈溢出问题的答案来说太冗长了,并且在官方文档中有很好的文档记录。

为了防止其他人在CF9上处理这一问题,我解决这个问题的方法是使用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速度更快,而且(尽管需要显式键入)比自定义序列化程序更可靠。

为了防止其他人在CF9上处理此问题,我解决此问题的方法是使用Jackson(从下载core、annotations和databind),然后使用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速度更快,而且(尽管需要显式键入)比自定义序列化程序更可靠。

所有属性都有默认值不是有帮助吗?可能在这里添加默认值会有帮助。所有属性都有默认值不是有帮助吗?可能在这里添加默认值会有帮助。我不确定这是否是一个“错误”。如何在JSON中表示
null
值?如果CFC上的某个属性尚未设置,并且没有默认值,则无论出于何种目的,它都是空的。在我看来,JavaScript中与
null
等价的是
undefined
。通过在JSON字符串中不包含属性,它在JavaScript中是未定义的。@ScottStroz读取JSON规范。它有一个
null
关键字。CF非常高兴地在其他情况下使用它(repro:
#serializeJson({key=“value”,nullKey=javaCast(“null”),结果是
{“nullKey”:null,“key”:“value”}
)。我不确定这是一个“bug”。如何在JSON中表示
null
值?如果CFC上的某个属性尚未设置,并且没有默认值,则无论出于何种目的,它都是空的。在我看来,JavaScript中与
null
等价的是
undefined
。通过在JSON字符串中不包含属性,它在JavaScript中是未定义的。@ScottStroz读取JSON规范。它有一个
null
关键字。CF非常高兴地在其他情况下使用它(repro:
#serializeJson({key=“value”,nullKey=javaCast(“null”),结果是
{“nullKey”:null,“key”:“value”}
)。