programing

JSONPath에서 문자열로 필터링하는 방법

batch 2023. 3. 27. 21:07
반응형

JSONPath에서 문자열로 필터링하는 방법

Facebook API의 JSON 응답은 다음과 같습니다.

{
  "data": [
     {
       "name": "Barack Obama", 
       "category": "Politician", 
       "id": "6815841748"
     }, 
     {
       "name": "Barack Obama's Dead Fly", 
       "category": "Public figure", 
       "id": "92943557739"
     }]
 }

JSONPath를 적용하여 "Politician" 카테고리의 결과만 반환하고 싶습니다.제가 읽은 바로는 다음과 같이 해야 할 것 같습니다.

$.data[?(@.category=='Politician')]

하지만 내가 찾은 테스트 도구에 따르면, 이것은 작동하지 않는다.==가 아닌 eq를 사용해야 한다는 질문을 또 받았습니다만, 그것도 잘 되지 않습니다.제가 뭘 잘못 알고 있는 거죠?

JsonPath 파서를 사용하면 쿼리는 정상으로 보이고 데이터와 쿼리가 작동합니다.자세한 술어 예는 해당 페이지의 예제 쿼리도 참조하십시오.

당신이 사용하고 있는 테스트 툴에 결함이 있는 것 같습니다.JsonPath 사이트의 예에서도 잘못된 결과가 반환되고 있습니다.

예:

{
    "store":
    {
        "book":
        [ 
            { "category": "reference",
              "author": "Nigel Rees",
              "title": "Sayings of the Century",
              "price": 8.95
            },
            { "category": "fiction",
              "author": "Evelyn Waugh",
              "title": "Sword of Honour",
              "price": 12.99
            },
            { "category": "fiction",
              "author": "Herman Melville",
              "title": "Moby Dick",
              "isbn": "0-553-21311-3",
              "price": 8.99
            },
            { "category": "fiction",
              "author": "J. R. R. Tolkien",
              "title": "The Lord of the Rings",
              "isbn": "0-395-19395-8",
              "price": 22.99
            }
        ],
        "bicycle":
        {
            "color": "red",
            "price": 19.95
        }
    }
}

그리고 그 표현은:$.store.book[?(@.length-1)].title툴은 모든 타이틀의 목록을 반환합니다.

json의 이름-값 쌍에서 값을 추출하기 위한 올바른 jsonpath 필터 구문을 찾을 수 없습니다.

다음은 구문과 트위터 문서의 간략한 예입니다.

이 사이트는 테스트에 도움이 되었습니다.

jsonpath 필터 식:

.events[0].attributes[?(@.name=='screen_name')].value

테스트 문서:

{
  "title" : "test twitter",
  "priority" : 5,
  "events" : [ {
    "eventId" : "150d3939-1bc4-4bcb-8f88-6153053a2c3e",
    "eventDate" : "2015-03-27T09:07:48-0500",
    "publisher" : "twitter",
    "type" : "tweet",
    "attributes" : [ {
      "name" : "filter_level",
      "value" : "low"
    }, {
      "name" : "screen_name",
      "value" : "_ziadin"
    }, {
      "name" : "followers_count",
      "value" : "406"
    } ]
  } ]
}

따옴표를 떼다:

List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");

이 Json 경로 예제 페이지도 참조하십시오.

편리할 때 브라우저 테스트 툴은 다소 오인될 수 있습니다.고려사항:

{
  "resourceType": "Encounter",
  "id": "EMR56788",
  "text": {
    "status": "generated",
    "div": "Patient admitted with chest pains</div>"
  },
  "status": "in-progress",
  "class": "inpatient",
  "patient": {
    "reference": "Patient/P12345",
    "display": "Roy Batty"
  }
}

대부분의 도구에서 false로 반환되었습니다.

$[?(@.class==inpatient)]

하지만 내가 이 모든 것에 대해

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>1.2.0</version>
</dependency>

그것은 사실로 돌아왔다.브라우저 테스트 툴에 의존하지 않고 간단한 유닛 테스트를 작성하여 검증할 것을 권장합니다.

"Alastair, 이 lib와 도구를 사용할 수 있습니다; DefiantJS. JSON 구조에서 XPath 쿼리를 활성화하고 다음 XPath를 테스트 및 검증할 수 있습니다.

//data[category="Politician"]

DefiantJS는 "search" 메서드를 사용하여 글로벌 개체를 확장합니다.그러면 일치하는 배열이 반환됩니다.Javascript에서는 다음과 같이 표시됩니다.

var person = JSON.search(json_data, "//people[category='Politician']");
console.log( person[0].name );
// Barack Obama

언급URL : https://stackoverflow.com/questions/12585968/how-to-filter-by-string-in-jsonpath

반응형