2014-12-12 3 views
0

아래 JSON 예제에서 source.id == 'x'인 객체의 target.id 값을 반환하고 싶습니다.중첩 된 표현식을 사용하여 JSON 객체를 찾는 방법은 무엇입니까?

그래서 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는 나에게 소스 ID와 $ .line [? (@. source.id == 'startId')]의 목록을 제공하여 오류를 반환합니다.

코드의 각 객체를 반복 할 수 있다는 것도 이해하지만, 수십 또는 수백 개의 '선'이 작동하면 매우 효율적이지 않습니다. 가능한 경우 객체에 대한 '직접적인'경로를 원합니다.

저는 자바 스크립트를 사용하여 나머지 응용 프로그램을 코딩하므로 자바 스크립트 예제가 도움이됩니다 (JSONPath의 유무에 관계없이).

+2

이유라도 같은 값을 얻을 수 Array.filter

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

함께 할 수 있습니까? (JSON이 아닌, 객체 그래프입니다 .JSON은 * 텍스트 * 표기법입니다.) 질문에서 JSON을 텍스트로 사용하는 것 같습니다. –

+0

JSONPath는 그 이름에도 불구하고 여전히 작동하는 것 같습니다. JSON 문자열이 아니라 파싱 된 객체. 따라서 객체를 반복합니다. –

+0

예 JSON을 문자열로 시작한 다음 JSON.parse (x)를 사용하여 객체를 만듭니다. JSONPath를 사용하면 json을 조각 내릴 수 있지만 다른 객체 값 즉, 객체 값을 기반으로 객체 값을 선택할 수있는 것처럼 보이지 않습니다. 'source'= foo 인 'target'을 선택하십시오 –

답변

1

json이 문자열로 표시되면 var json = JSON.parse(jsonStr)을 사용하십시오. 그럼 당신은 그럼 당신은 그냥 JSON을 구문 분석하고 결과 객체 그래프 작동하지 않을 수있는이

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

* "코드의 각 객체를 반복 할 수 있다는 것도 이해하지만 매우 효율적이지는 않을 것입니다."* (그리고 그것은 그들이 파싱 한 것으로 가정합니다. JSON). –

+0

안녕하세요. 예, 감사합니다. T.J가 지적했듯이 필터는 모든 '선'을 반복하여 true 또는 false를 반환합니다. 이것이 제가 원하는 것을 할 수있는 유일한 방법이라면, 그것을 사용하게되어 기쁩니다. 나는 단지 그것을하는 "더 좋은"방법이있을 수 있다고 생각했습니다. –

관련 문제