2015-05-28 2 views
2
SerializeJSON(cfquery) 

создает JSON, который выглядит следующим образом:используя SerializeJSON из cfm, как я могу просто вывести часть данных?

"COLUMNS":["POINT","LOCATION"],"DATA":[["41.322365,-71.679251","Ashaway... 

Как я вывожу JSON данных только?

т.е. ...

[["41.322365,-71.679251","Ashaway... 
+1

Какая у вас конечная цель? Вы можете получить доступ к запросу типа struct и вытащить данные, если это то, что вы после –

+0

Строковые функции. Найдите положение двойных квадратных скобок и используйте функции справа и длины, чтобы получить все после этого. –

+0

Я пытаюсь вытащить JSON/массив для поддержки типа. Для типа head требуется плоский JSON/массив для продвижения вперед. Тип, который я использую, это: http://www.runningcoder.org/jquerytypeahead/ – arcee123

ответ

7

Я не думаю, что это удобный способ сделать это, если вы не можете изменить код, сериализацию запрос; в противном случае вам понадобится использовать некоторые манипуляции с строкой. Тем не менее, если у вас есть доступ к CF кода, сериализации запрос, это немного неортодоксальные, но делает работу:

<!---Serialize and Deserialize the cfquery to shortcut obtaining a Structure---> 
<cfset queryAsStruct = DeSerializeJSON(SerializeJSON(cfquery))> 
<!---Now serialize the data key of the struct---> 
<cfset dataJSON = SerializeJSON(queryAsStruct.data)> 

Как я уже говорил, не самый красивый, может быть ... но, кажется, чтобы сделать это , Может быть более удобный/более эффективный способ преобразования cfquery в структуру, но это привело к наименьшему количеству строк кода для меня.

Редактировать: Просто подумал, чтобы объяснить, почему это работает. Строка JSON при десериализации ColdFusion больше не обнаруживается как объект запроса, а просто простая структура, поэтому ключ «DATA» создается и заполняется. Таким способом вы можете получить к нему доступ в качестве ключа структуры. Когда cfquery является объектом запроса, в то время как объект типа «struct» имеет особые соображения, которые не позволяют вам напрямую обращаться к ключу данных (насколько мне известно).

+1

Очки за творческий подход :) Тем не менее, ИМО надлежащим образом для этого нужно сгенерировать правильную структуру, а не сбрасывать объект запроса. Создайте массив массивов. Затем сериализуйте. – Leigh

+0

Это было прекрасно Линдон. Большое спасибо. Это помогло мне построить. – arcee123

0

Пример запроса

q = QueryNew(''); 
point = [ "41.322365,-71.679251" ]; 
location = [ "Ashaway" ]; 
QueryAddColumn(q,"point",point); 
QueryAddColumn(q,"location",location); 

CF10 +(Использование "для строки в запросе" синтаксис)

data = []; 
for(row in q) { 
    // append array of two values 
    ArrayAppend(data, [ row.point, row.location ]); 
} 
data = SerializeJSON(data); 

CF9.01

data = []; 
for(row=1; row <= q.recordcount; row++) { 
    rowdata = []; 

    ArrayAppend(rowdata,q.point[ row ]); 
    ArrayAppend(rowdata,q.location[ row ]); 
    ArrayAppend(data,rowdata); 
} 
data = SerializeJSON(data); 

Результат:

[["41.322365,-71.679251","Ashaway"]] 
+0

Этот ответ приводит нас к первой строке вопроса. Он никоим образом не отвечает на это. Следовательно, нисходящий. –

+0

(Edit) Вышеуказанное близко (если он может использовать небольшое объяснение). Джереми. Похоже, им нужно создать массив массивов. Таким образом, элемент 'rowdata' должен быть массивом из двух элементов, содержащим [« POINT »,« LOCATION »], а не просто простую строку. Также 1) «Точка» пара числовых значений и «местоположение» - это описание, подобное «Ashaway ...». и 2) избавиться от 'data = [data];' он не нужен, и он не делает то, что вы считаете ...Добавьте описания в свой примерный запрос, и вы увидите, что я имею в виду. – Leigh

+0

Возможно, я неправильно понял вопрос, но я думал, что требуемый вывод был таким, как показано в последнем примере кода вопроса, который представляет собой массив, содержащий массив с данными как пары строк? Ли, вы можете быть правы, но это не то, что я вижу в этом примере. –