Coldfusion 8 JSON — преобразовать возвращаемую строку в объект запроса

Я относительно новичок, взаимодействующий с другими системами с использованием функций JSON, и, возможно, я просто ломаю голову над основной проблемой.

Я получаю доступ к функции API, которая возвращает запрос в виде строки JSON. Формат возврата "обычный". Запрос выполняется для выбора списка школ и создает массив структур в качестве возвращаемой строки.

"[{\"city\":\"Adrian\",\"state\":\"MI\",\"school\":\"Adrian College\"},{\"city\":\"Albion\",\"state\":\"MI\",\"school\":\"Albion College\"},.........etc.

Итак, теперь мне нужно преобразовать это в объект запроса и работать с ним, но теперь я просто хожу по циклам google/test/re-google/re-test. Любые указатели на то, как превратить это в запрос со школой/городом/штатом в качестве столбцов?


person Steve    schedule 08.11.2012    source источник
comment
Имейте в виду, что обратная косая черта означает экранирование кавычек. Поскольку тип возвращаемого значения простой, похоже, что API считает, что это должна быть простая строка, передаваемая в JavaScript, поэтому он берет объект JSON и преобразует его в строку, а не сохраняет его в JSON.   -  person Billy Cravens    schedule 10.11.2012


Ответы (3)


Сначала используйте deserializeJson, чтобы преобразовать строку во что-то пригодное для использования.

Затем используйте StructKeyList для первого элемента массива, чтобы получить столбцы для использования в QueryNew.

Затем выполните два цикла — один через массив, выполняющий QueryAddRow, содержащий внутренний цикл через столбцы, которые QuerySetCell устанавливают значения.


Примерно так:

<cfset Data = deserializeJson(JsonString) />

<cfif NOT ArrayLen(Data)>
    <cfthrow message="No data" />
</cfif>

<cfset Q = QueryNew( StructKeyList(Data[1]) ) />

<cfloop index="i" array=#Data#>
    <cfset Row = QueryAddRow(Q) />
    <cfloop index="ColName" collection=#Data[i]# >
        <cfset QuerySetCell( Q , ColName , Data[i][ColName] , Row ) />
    </cfloop>
</cfloop>

<cfdump var=#Q# />

В идеале поместите его внутрь функции (что означает соответствующую область видимости переменной).

person Peter Boughton    schedule 08.11.2012
comment
Это то, что я предполагал - однако deserializeJson терпит неудачу: "JSON parsing failure at character 1:'<' in "[{\"city\":\"Adrian\",\"state\":\"MI\",\"school\":\"Adrian College\"} - person Steve; 08.11.2012
comment
Тогда это, вероятно, недействительный JSON. Что говорит jsonlint.com? - person Peter Boughton; 08.11.2012
comment
символ 1 не < - не уверен, что там происходит - однако, если фактическая переменная содержит "[{\"city\" и т. д., то у вас есть строка JSON, которая содержит объект JSON, т.е. она была закодирована дважды. - person Peter Boughton; 08.11.2012
comment
Странно - если я использую Firebug и создаю строку с возвращаемыми данными, она работает как положено. <cfset theString = '[{\"city\":\"Adrian\",\"state\":\"MI\",\"school\":\"Adrian College\"}}'/> - person Steve; 08.11.2012
comment
jsonlint.com выдает ошибку разбора файла \. Если я делаю замену на \, он проходит проверку нормально. Может ли CFHTTP что-то добавить? У меня установлено значение result="httpResult", а затем я заменяю \ на это. - person Steve; 08.11.2012
comment
Я немного изучил API, и в CFC установлен простой формат возврата. Запрос зацикливается на построении массива структур, которые затем сериализуются в JSON и возвращаются в виде строки. Независимо от того, что я, кажется, делаю, я продолжаю получать эту ошибку о «‹», которая, кажется, не существует в данных. - person Steve; 08.11.2012

Похоже, вам нужно использовать метод DeserializeJSON(). Подробнее здесь.

person Mathachew    schedule 08.11.2012

Решено! Был второй CFC, который проксировал все запросы API и проверял учетные данные API. Все API CFC расширены из этого прокси-CFC, а прокси-CFC отсутствовал returnformat="plain".

Как только мы их установили, данные вернулись, как и ожидалось. Спасибо за все предложения.

person Steve    schedule 08.11.2012