2014-09-02 65 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它比自定義序列化程序更加可靠並且(儘管需要明確的鍵入)更可靠。