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)]");
편리할 때 브라우저 테스트 툴은 다소 오인될 수 있습니다.고려사항:
{
"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
'programing' 카테고리의 다른 글
MongoError: 컬렉션을 삭제하려고 하면 ns를 찾을 수 없습니다. (0) | 2023.03.27 |
---|---|
MongoDB에 컬렉션 명명 규칙이 있나요? (0) | 2023.03.27 |
Next.js: 문서가 정의되지 않았습니다. (0) | 2023.03.27 |
Oracle: CSV 파일 Import (0) | 2023.03.27 |
모든 ACF 필드를 Wordpress REST API에 표시하는 방법 페이지와 사용자 지정 포스트타이프 (0) | 2023.03.27 |