Как вы возвращаете JSON в нижнем регистре из CFCin ColdFusion? - PullRequest
8 голосов
/ 10 сентября 2011

У меня есть компонент 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, который кто-то другой написал)?

Ответы [ 3 ]

17 голосов
/ 10 сентября 2011

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

<cfset structName.varName = "test" />

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

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

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

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

5 голосов
/ 10 сентября 2011

От 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 вручную, в нижнем регистре каждая из клавиш, но это не очень хорошее решение. : /

0 голосов
/ 20 ноября 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;
    }
}

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

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;
    }
}
...