Как найти объект JSON с помощью вложенного выражения?

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

Итак, где source.id == 'startId' возвращает 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 или без него).


person Magic Lava    schedule 12.12.2014    source источник
comment
По какой причине вы не можете просто проанализировать JSON, а затем работать с полученным графом объектов? (Это не JSON, это граф объектов. JSON - это текстовая нотация.) Судя по вашему вопросу, похоже, что вы работаете с JSON как с текстом...   -  person T.J. Crowder    schedule 12.12.2014
comment
Несмотря на свое название, JSONPath по-прежнему работает с анализируемым объектом, а не со строкой JSON. Таким образом, он также выполняет итерацию по объекту.   -  person Felix Kling    schedule 12.12.2014
comment
Да, я начинаю с JSON в виде строки, а затем создаю объект, используя JSON.parse(x). JSONPath позволяет мне нарезать json вверх, но, похоже, не позволяет мне выбирать значение объекта на основе другого значения объекта, т.е. выберите «цель», где «источник» = foo   -  person Magic Lava    schedule 12.12.2014


Ответы (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 });
person Amit Joki    schedule 12.12.2014
comment
Я также понимаю, что я мог бы перебирать каждый объект в коде, но это было бы не очень эффективно... (и это при условии, что они проанализировали JSON). - person T.J. Crowder; 12.12.2014
comment
Привет Амит. Да, это работает, спасибо, но, как указал TJ, фильтр перебирает каждую «строку» и возвращает true или false. Если это единственный способ сделать то, что я хочу, то я с удовольствием им воспользуюсь. Я просто подумал, что может быть есть лучший способ сделать это. - person Magic Lava; 12.12.2014