Как вы возвращаете JSON в нижнем регистре из CFC в ColdFusion?

У меня есть компонент ColdFusion, который возвращает некоторые данные JSON:

component
{
    remote function GetPeople() returnformat="json"
    {
        var people = entityLoad("Person");
        return people;
    }
}

К сожалению, возвращенный JSON имеет все имена свойств в верхнем регистре:

[
    {
        FIRSTNAME: "John",
        LASTNAME: "Doe"
    },
    {
        FIRSTNAME: "Jane",
        LASTNAME: "Dover
    }
]

Есть ли способ заставить фреймворк возвращать JSON, чтобы все имена свойств были строчными (может быть, пользовательская UDF/CFC, написанная кем-то другим)?


person Daniel T.    schedule 10.09.2011    source источник


Ответы (3)


Из http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_s_03.html
Примечание. ColdFusion внутренне представляет имена ключей структуры с использованием символов, состоящих только из прописных букв, и, следовательно, сериализует имена ключей в представлениях JSON, состоящих только из прописных букв. . Любой код JavaScript, обрабатывающий JSON-представления структур ColdFusion, должен использовать имена ключей структур, набранные прописными буквами, например CITY или STATE. Вы также используете имена COLUMNS и DATA, написанные полностью в верхнем регистре, в качестве ключей для двух массивов, представляющих запросы ColdFusion в формате JSON.

Если вы сами определяете переменные, вы можете использовать обозначение скобок (как показывает ответ Джейсона), но со встроенными вещами, такими как ORM, я думаю, вы застряли - если вы не хотите создать свою собственную структуру и клонировать версию ORM вручную, переводя каждую клавишу в нижний регистр, но это не очень хорошее решение. :/

person Peter Boughton    schedule 10.09.2011
comment
Нет :(. Во-первых, это должен быть глубокий клон, что означает, что все ленивые ссылки будут оцениваться. - person Daniel T.; 10.09.2011
comment
Если ваши сериализуемые объекты, я считаю, передаются именно так, как было написано в cfc: memento = serializeJson(this); - person Aaron Greenlee; 10.09.2011

Да, к сожалению, так работает ColdFusion. При установке некоторых переменных вы можете принудительно использовать строчные буквы, как в структурах:

<cfset structName.varName = "test" />

Установит переменную с именами в верхнем регистре. Но:

<cfset structName['varname'] = "test" />

Заставит использовать нижний регистр (или верблюжий регистр в зависимости от того, что вы передаете).

Но с ORM, которым вы занимаетесь, я не думаю, что вы сможете иметь какой-либо контроль над ним. Кто-нибудь, поправьте меня, если я ошибаюсь.

person Jason Dean    schedule 10.09.2011

Это должно работать, как вы описали.

component
{
    remote function GetPeople() returnformat="json"
    {
        var people = entityLoad("Person");
        var rtn = [];
        for ( var i = 1; i <= arrayLen( people ); i++ ) {
            arrayAppend( rtn, {
                "firstname" = people[i].getFirstname(),
                "lastname" = people[i].getLastname()
            } );
        }
        return rtn;
    }
}

Если какое-либо из ваших свойств объекта возвращает значение null, ключ структуры не будет существовать. Чтобы обойти это, попробуйте это

component
{
    remote function GetPeople() returnformat="json"
    {
        var people = entityLoad("Person");
        var rtn = [];
        for ( var i = 1; i <= arrayLen( people ); i++ ) {
            var i_person = {
                "firstname" = people[i].getFirstname(),
                "lastname" = people[i].getLastname()
            };
            if ( !structKeyExists( i_person, "firstname" ) ) {
                i_person["firstname"] = ""; // your default value
            }
            if ( !structKeyExists( i_person, "lastname" ) ) {
                i_person["lastname"] = ""; // your default value
            }
            arrayAppend( rtn, i_person );
        }
        return rtn;
    }
}
person Mike Causer    schedule 20.11.2011