ColdFusion9:在Hibernate实体上使用serializeJson将数字属性编码为字符串

时间:2011-07-08 19:13:14

标签: json hibernate serialization coldfusion

我正在编写我的第一个支持ORM的REST api,并且遇到了JSON序列化的一些问题。这是我的一个实体定义:

component persistent="true" extends="Base" {

    property name="id"
             fieldtype="id"
             generator="native"
             ormtype="int"
             type="numeric";

    property name="relationship"
             type="string"
             ormtype="string";

    property name="comment"
             type="string"
             ormtype="text";

    //related entities
    property name="termA"
             cfc="term"
             fieldtype="many-to-one"
             fkcolumn="termA"
             lazy="false";

    property name="termB"
             cfc="term"
             fieldtype="many-to-one"
             fkcolumn="termB"
             lazy="false";

    //override getMemento to include appropriate relationships
    public struct function getMemento(){
        //standard stuff
        local.memento = super.getMemento();

        //custom add-ons
        local.memento["termA"] = this.getTermA().getId();
        local.memento["termB"] = this.getTermB().getId();

        return local.memento;
    }

}

这是它扩展的Base实体(对于super.getMemento等):

component extends="core.v1.models.Base" {

    public struct function getMemento(){
        local.memento = deserializeJson(serializeJson(this));
        //fix numerics showing up as strings
        if (structKeyExists(local.memento, "id")){
            local.memento.id = javacast("int", local.memento.id);
        }
        return local.memento;
    }

    public array function transformCollectionIntoMementos(array input){
        if (arrayLen(arguments.input) > 0){
            for (var i = 1; i <= arrayLen(arguments.input); i++){
                arraySet(arguments.input,i,i,arguments.input[i].getMemento());
            }
        }
        return arguments.input;
    }
}

扩展的类与此无关。

最后,这是一个简化版本的代码,用于呈现数据的json表示:

<cfoutput>#serializeJson(transform(entityLoad("interaction")))#</cfoutput>

public array function transform(array input){
    if (arrayLen(arguments.input) > 0){
        for (var i = 1; i <= arrayLen(arguments.input); i++){
            arraySet(arguments.input,i,i,arguments.input[i].getMemento());
        }
    }
    return arguments.input;
}

您可以在第二个代码段中的getMemento()实现中看到我试图通过将所有ID属性的值(每个实体都有一个名为“id”的属性)javacasting为整数来解决此问题。这不起作用。我也试过了javacast("int", local.memento.id * 1);,这也不起作用。

无论我尝试过什么,生成的json都是这样的:

[{"termB":"2","termA":"1","id":"1","relationship":"+"},{"termB":"4","termA":"1","id":"3","relationship":"-"}]

我期待的是:

[{"termB":"2","termA":"1","id":1,"relationship":"+"},{"termB":"4","termA":"1","id":3,"relationship":"-"}]

我很茫然。我错过了什么?为什么这不起作用?

2 个答案:

答案 0 :(得分:3)

Adob​​e对serializeJSON进行了哪些更改?

http://coldfusion.tcs.de/adobe-please-fix-coldfusion-serializejson/

答案 1 :(得分:1)

也许你可以使用它:http://jsonutil.riaforge.org/它解决了整数被转换为字符串的问题。