2014-12-12 2 views
0

Из приведенного ниже примера JSON я хотел бы вернуть значение target.id объекта, где source.id == 'x'.Как найти объект JSON с помощью вложенного выражения?

Итак, где source.id == 'startId' return target.id == '3eecd840-e6a8-423c-a892-7df9646fde5d'.

{ 
     "line":[ 
     { 
      "type":"link", 
      "source":{ 
       "id":"startId", 
       "port":"out" 
      }, 
      "target":{ 
       "id":"3eecd840-e6a8-423c-a892-7df9646fde5d", 
       "port":"in" 
      }, 
      "id":"87d88a26-3a28-4db0-8016-71c1c4665f14" 

     }, 
     { 
      "type":"link", 
      "source":{ 
       "id":"3eecd840-e6a8-423c-a892-7df9646fde5d", 
       "port":"outYes" 
      }, 
      "target":{ 
       "id":"49940c02-70f2-4c53-ab50-9cbf96903600", 
       "port":"in" 
      }, 
      "id":"9f8c365e-9ca7-440f-a722-c4f340782c0c" 
     } 
     ] 
    } 

Я пробовал JSONPath, но я не могу выработать выражение для использования. $ .line [*]. source.id дает мне список исходных идентификаторов и $ .line [? (@. source.id == 'startId')] возвращает ошибку.

Я также понимаю, что я мог выполнять итерацию по каждому объекту в коде, но это было бы не очень эффективно, если бы у меня было десятки или сотни «линий» для работы. Если возможно, мне нужен более «прямой» путь к объекту.

Я использую javascript для кодирования остальной части приложения, поэтому примеры javascript будут полезны (с JSONPath или без него).

+2

какой-либо причине вы не можете просто разбора JSON, а затем работать с результирующим графа объектов? (Что не является JSON, это графический объект. JSON - это текстовая нотация.) Из вашего вопроса, похоже, вы работаете с JSON как текст ... –

+0

Несмотря на свое название, JSONPath все еще работает с анализируемый объект, а не строка JSON. Таким образом, он также выполняет итерацию над объектом. –

+0

Да, я начинаю с JSON в виде строки, а затем создаю объект с помощью JSON.parse (x). JSONPath позволяет мне нарезать json вверх, но, похоже, не позволяет мне выбрать значение объекта на основе другого значения объекта, т.е. выберите «target», где «source» = foo –

ответ

1

Если вы используете json как строку, используйте var json = JSON.parse(jsonStr). После этого вы можете сделать это с Array.filter

var result = json.line.filter(function(obj){ 
    return obj.source.id == "startId" 
}); 

Тогда вы могли бы получить значения, как этот

var ids = result.map(function(o){ return o.target.id }); 
+0

* «Я также понимаю, что я мог выполнять итерацию по каждому объекту в коде, но это было бы не очень эффективно ...» * (и предполагается, что они проанализировали JSON). –

+0

Hi Amit. Да, это работает, спасибо, но, как указал Т.J., фильтр выполняет итерацию через каждую строку и возвращает true или false. Если это единственный способ сделать то, что я хочу, то я рад его использовать. Я просто подумал, что может быть «лучший» способ сделать это. –

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

  • Нет связанных вопросов^_^