2016-05-17 3 views
1

У меня есть данные в формате JSON, как следующийИспользование данных JSON в ColdFusion

{ 
"category" : [ 
    { 
     "name" : "digital stickers", 
     "products" : [ 
      { 
       "name" : "round digital stickers", 
       "urlPublic" : "index.cfm/digital-stickers/round-stickers", 
       "urlPortal" : "tab=round digital stickers" 
      }, 
      { 
       "name" : "square digital stickers", 
       "urlPublic" : "index.cfm/digital-stickers/square-stickers", 
       "urlPortal" : "tab=square digital stickers" 
      } 
     ] 
    }, 
    { 
     "name" : "Litho stickers", 
     "products" : [ 
      { 
       "name" : "round litho stickers", 
       "urlPublic" : "index.cfm/litho-stickers/round-stickers", 
       "urlPortal" : "tab=round litho stickers" 
      }, 
      { 
       "name" : "square litho stickers", 
       "urlPublic" : "index.cfm/litho-stickers/square-stickers", 
       "urlPortal" : "tab=square litho stickers" 
      } 
     ] 
    } 
] 
} 

Я использовал DeserializeJSON(theData) ниже

<cfset cfData=DeserializeJSON(theData)> 

Я затем установить массив данных для хранения категории значений

<cfset dataArray = cfData.category> 

и выплевывали их в петлю

<cfloop array="#dataArray#" index="elem"> 
    <!--- print out value for demo purposes ---> 
    <cfoutput> 
      <h3>#elem.name#</h3> 

    </cfoutput> 
</cfloop> 

Все это отлично работает, и я вижу рубрики 2 категории - «цифровые наклейки» и «лито-наклейки».

Что я хочу сделать сейчас, это отображать продукты в списке по каждой соответствующей категории. Таким образом, под «цифровыми наклейками» есть «круглые цифровые наклейки» и «квадратные цифровые наклейки», то под литовыми наклейками есть «круглые лито-наклейки» и «квадратные лито-наклейки» и т. Д.

Я попытался создать новый массив как показано ниже

<cfset productArray = cfData.products> 

, но я получил сообщение об ошибке «Элемент PRODUCTS не определено в CFDATA»

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

Любая помощь будет принята с благодарностью - заблаговременно!

ответ

2

Вы получаете ошибку, потому что продукты не находятся под cfData. Массив продуктов находится под cfdata.category[i].products. Для достижения желаемого результата, вы можете сделать что-то, как показано ниже:

<cfoutput> 
    <h3>#elem.name#</h3> 
    <cfloop array="#elem.products#" index="innerelem"> 
     #innerelem.name#<br> 
    </cfloop> 
</cfoutput> 

Update:

После того, как вы десериализации JSON, это просто нормальная структура. Ваш cfdata.category (dataArray) - это array of structures с ключами и ключами продуктов. products is another array of structures.

При переходе через dataArray в переменной elem вы получаете структуру с именем и ключами продуктов. Затем вам нужно зацикливать продукты, чтобы получить имена внутри продуктов, которые я делаю в приведенном выше коде.

Чтобы понять код, используйте cfdump на каждом этапе.

  1. Внутри первого контура, cfdump elem. Вы получите структуру имени и продуктов.
  2. Вы получаете доступ к имени elem.name.
  3. Аналогичным образом вы можете получить доступ к продуктам elem.products.
  4. Если вы cfdump elem.продуктов, вы заметите, что это массив структуры.
  5. Как вы можете получить доступ к массиву elem.products, вы можете его закодировать, поскольку у вас есть петля массив cfdata.category. Вы должны сделать это в первом цикле, так как вы можете получить доступ к элементам elem.products в первом цикле.
  6. Теперь во втором цикле вы получаете каждую структуру внутри elem.products в переменной innerelem.
  7. cfdump innerelem во втором цикле. Вы увидите структуру с именем ключей, urlpublic и urlportal с их соответствующими значениями.
  8. Поскольку у вас есть доступ к этой структуре, вы можете получить свои имена innerelem.name.
  9. Вы сделали добро с URL.
  10. Используйте cfdump для понимания кода и для отладки кода. Также при разработке кода. Это вам очень поможет.
+1

Абсолютно совершенный. Хотя я должен быть честным. Я не понимаю этого полностью. Является ли «# elem.products #» доступ к следующему уровню в структуре JSON? Затем каждый раз создается новый массив? Тогда, когда вы делаете «# innerelem.name #», который будет перебирать все имена продуктов. Чтобы получить мои ссылки плеваться правильно я адаптировал это «

  • #innerelem.name#

  • » Как я уже сказал - работает удовольствие. Благодарю. – Sprose

    +0

    @ user3008971, пожалуйста, проверьте обновление. –

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