2014-09-02 64 views
1

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

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"} 
+1

不会有所有属性的默认值帮助吗? – 2014-09-02 06:16:19

+0

可能添加默认值将有助于此处。 – Sks 2014-09-02 07:44:33

回答

3

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

幸运的是,ColdFusion 11有一个(相当差的实现,IMO)机制让你定义你自己的组件序列化过程。

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

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

+2

不知道我同意这是一个'错误'。你将如何在JSON中表示一个'null'值?如果CFC上的属性尚未设置,并且没有默认值,那么对于所有意图和目的,都是'null'。在我看来,在JavaScript中相当于'null'将是'undefined'。通过不包含JSON字符串中的属性,它在JavaScript中是未定义的。 – 2014-09-02 12:31:34

+1

@ScottStroz阅读JSON规范。它有一个'null'关键字。并且CF很高兴地在其他情况下使用它(repro:' #serializeJson({key =“value”,nullKey = javaCast(“null”,“”)))#'{“NULLKEY” “KEY”: “值”}')。 – 2014-09-02 13:45:41

+2

采取点...继续... – 2014-09-02 14:30:07

1

万一别人处理这个上CF9,我解决这个问题的方法是通过使用杰克逊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的变量,以获得正确的布尔,数字和整数(无自动打字状内置的串行器。)杰克逊i它比自定义序列化程序更加可靠并且(尽管需要明确的键入)更可靠。