2013-04-05 4 views
2

Я работал с данными JSON в прошлом - в основном «fudging» мой путь к решению, и не совсем понимаю, почему и как все работает. Я столкнулся с проблемой, когда возвращаемые данные выглядят несколько иначе, чем я видел раньше, и я не могу найти примеры, которые соответствуют этому.Использование данных JSON с Coldfusion

Ниже приведен пример данных, возвращаемых (через API);

{"domain.co.uk":{"status":"available","classkey":"thirdleveldotuk"},"domain.net":{"status":"available","classkey":"dotnet"},"domain.com":{"status":"available","classkey":"domcno"}} 

На моем переднем конце, мне нужно вернуть что-то вроде этого -

  • domain.co.uk - доступен
  • domain.net - доступен
  • domain.com - доступен

Поскольку значение «domain.com» и т. Д. Всегда будет меняться, я не могу отображать имена, как обычно (хотя это всегда будет 3 строки s ')

Я проверил каждый CF-документ, который у меня есть, и прочитал онлайн-документы CF, но я полностью в недоумении, где даже начать с этого!

Указатели очень ценятся!

ответ

7

Если вы запустите это с помощью deserializeJSON (данных), вы увидите, что вы просто закончите со структурами с вложенными структурами. Таким образом, вы можете прокручивать свою структуру, захватывать ключи, а затем захватывать статус этого ключа. В терминах JSON ваш объект JSON имеет вложенные объекты.

<cfset data = deserializeJSON(apiData) /> 
<cfset formattedData = [] /> 
<cfset tmp = {} /> 

<cfloop collection=#data# item="domain"> 
    <cfset tmp.domain = domain /> 
    <cfset tmp.status = data[domain]["status"] /> 
    <cfset arrayAppend(formattedData,duplicate(tmp)) /> 
</cfloop> 

<cfdump var=#formattedData# /> 
+0

ничего себе! Спасибо @ J.T. - это сработало, и мне помогло нечто совсем другое! – Lee

6

(Это действительно больше комментариев, но это немного слишком долго ...)

Я работал с данными JSON в прошлом - в основном «жульничество» мой путь к решения, и на самом деле не понимая, почему и как работают вещи

JSON строка по существу лишь представление двух объектов:

  • массивы, которые обозначаемые [] и
  • структуры (или объекты), которые обозначаются через {}

Глядя на строку API, брекеты {} указать, что вы имеете дело со структурой:

 { "theKey": "theValue" } 

В вашем случае это доменное имя key:

{ "domain.co.uk": "theValue" } 

.. и value является вложенной структуры, содержащей два статических ключей: «статус» и «ClassKey»

{ "theKey": {"status":"available","classkey":"thirdleveldotuk"} } 

Как и с любой структурой, вы можете перебирать ключи динамически с помощью for .. in цикла, цикл коллекции, если вы предпочитаете cfml.

 for (theKey in theStruct) { 
     WriteDump(theKey); // ie "domain.co.uk" 
    } 

Затем в цикле использовать ассоциативный массив обозначений, чтобы захватить value, то есть:

 theStatus = theStruct[ theKey ]["status"]; // "available" 

    // ... OR 
    theValue = theStruct[ theKey ]; 
    theStatus = theValue.status; 

То есть все, что есть в ней. Вы можете использовать аналогичную логику для доступа к любым типам вложенных структур.

+0

спасибо за подробное объяснение, это невероятно полезно! Я действительно изо всех сил старался найти достойное прохождение этого в любом другом месте, поэтому я, безусловно, буду ссылаться на это в будущем. – Lee

+0

Да, у меня были подобные мысли в первый раз, когда я работал с JSON :) Но как только вы сломаете это, это проще, чем кажется на первый взгляд. Во всяком случае, рад, что это помогло! – Leigh

Смежные вопросы