2014-12-18 3 views
1

Я использую AngularJS шаблон для отображения JSON как список/древовидная структура.Использование рекурсии для изменения JSON

My JSON глубина неизвестна. В большинстве случаев работает мой код. Есть только один случай, с которым я столкнулся до сих пор, что не работает.

Мой JSON образец:

[ 
    { 
     "type":"image", 
     "bitmapname":{ 
     "text":"Image_12.bmp" 
     }, 
     "command":[ 
     { 
      "type":"close", 
      "text":"1234" 
     }, 
     { 
      "type":"place", 
      "text":"company" 
     }, 
     { 
      "type":"key", 
      "key": "Tab" 
     }, 
     { 
      "type":"keyboard", 
      "text":"welcome", 
      "command": [ 
       { 
        "type":"open", 
        "text":"1234" 
       }, 
       { 
        "type":"home", 
        "text":"company" 
       } 
      ] 
     } 
     ] 
    }, 
    { 
     "type":"image", 
     "bitmapname":{ 
     "text":"image_14.bmp" 
     }, 
     "command":{ 
     "type":"move", 
     "text":"right" 
     } 
    } 
] 

Выход ниже:

enter image description here

AngularJS код:

<script type="text/ng-template" id="xml.html"> 
    <!-- XML is coming from controller as a JSON shown in my sample --> 
    <ul> 
     <li ng-repeat="item in XML"> 

      [[ item["type"] ]] 

      <div ng-include=" 'xml.html' " 
       onload="XML = item.command"> 
      </div> 

     </li> 
    </ul> 

</script> 

<div ng-include=" 'xml.html' "> 

Как вы заметили, последний элемент списка пуст, потому что "command" - не A rray

Я пытаюсь создать рекурсивную функцию, которая будет идти через JSON и создавать массивы на одном элементе "command": [{...}] в тех местах, где у меня есть "command": {...}

Может кто-нибудь предложить решение, которое будет преобразовывать объект в массив объект, где у меня есть один-единственный объект?

ПРИМЕЧАНИЕ

У меня нет контроля над JSON не отправляются с Django поддержал. Python использует расширение xmltodict для преобразования XML в словарь. Всякий раз, когда теги XML не имеют дочерних элементов, он не создает список. Он создает только словарь.

+1

Можете ли вы рассказать нам, почему ваш JSON не последовательно, используя массив для '.command' свойств ? Лучшим решением здесь было бы начать с согласованного формата данных и не находить обходные пути для непоследовательного. – JLRishe

+0

JSON создается из XML. И расширение python, которое преобразует XML в JSON, не создает массив, когда тег «command» в XML не имеет детей. – Brian

+0

У меня возникли аналогичные проблемы при использовании автоматической сериализации XML -> JSON. Я думаю, что хорошим решением было бы использовать подход, основанный на структуре данных, к сериализации данных, но я добавил ответ с обходным решением, которое вы запрашиваете. – JLRishe

ответ

1

Этого не очень общий подход, но он должен работать для вашего требования:

function fixCommands(values) { 
    values.filter(function (v) { 
     return 'command' in v; 
    }) 
    .forEach(function (v) { 
     if(v.command.constructor === Array) { 
      fixCommands(v.command); 
     } else { 
      v.command = [v.command]; 
     } 
    }); 
} 

jsfiddle example

+0

Tnx JLRishe, я дам вам знать, как только я это проверю – Brian

0

Вы можете проверить первый элемент, который является его объектом или нет, если это был объект, который вы можете сделать петлю на нем в противном случае это в другом типе, который вы упомянули в top.for примера

if(arr[i].command.length===undefined) -> so is string part 
else -> is array part 
Смежные вопросы