当我将组件序列化为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"}
答案 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的变量才能获得正确的布尔值,数值和整数值(不像内置的序列化程序那样自动输入。)杰克逊要快得多(尽管明确了)需要输入)比自定义序列化器更可靠。