ColdFusion9: при использовании serializeJson для объекта Hibernate кодирует числовые свойства в виде строк - PullRequest
2 голосов
/ 08 июля 2011

Я пишу свой первый API-интерфейс REST с поддержкой ORM и имею некоторые проблемы с сериализацией 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;
    }

}

Это базовая сущность, которую она расширяет (среди прочего, для 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() во 2-м фрагменте кода, что я пытаюсь решить эту проблему путем добавления значения всех свойств идентификатора (у каждого объекта есть свойство с именем "id") в целое число. Это не работает Я также попробовал 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 ]

3 голосов
/ 08 июля 2011

Это изменение, которое Adobe внесла в сериализацию JSON?

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

1 голос
/ 12 сентября 2011

Может быть, вы можете использовать это: http://jsonutil.riaforge.org/ Это решило мои проблемы с преобразованием целых чисел в строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...