отфильтровать Json по строке в массиве в JSONPATH

У меня есть ситуация, когда у меня есть строка json, у которой есть дочерний элемент в виде массива, который содержит только строки. Есть ли способ получить ссылку на объект массивов, содержащих определенную строку. Пример:

{ "Books":{  
      "History":[  
         {  
            "badge":"y",
            "Tags":[  
               "Indian","Culture"
            ],
            "ISBN":"xxxxxxx",
            "id":1,
            "name":"Cultures in India"
         },
         {  
            "badge":"y",
            "Tags":[  
               "Pre-historic","Creatures"
            ],
            "ISBN":"xxxxxxx",
            "id":1,
            "name":"Pre-historic Ages"
         }
     ]
  }
}

Для достижения: из приведенной выше строки JSON необходимо получить все книги в истории, которые содержат «индийский» в списке «тегов».

Я использую JSONPATH в своем проекте, но если есть другой API, который может обеспечить аналогичную функциональность, приветствуется любая помощь.


person user2413561    schedule 04.05.2015    source источник


Ответы (3)


Если вы используете Goessner JSONPath, $.Books.History[?(@.Tags.indexOf('Indian') != -1)], как указано Дунканом выше, должно работать.

Если вы используете порт Jayway Java (github.com/jayway/JsonPath), то $.Books.History[?(@.Tags[?(@ == 'Indian')] != [])] или более элегантно используйте оператор in, например $.Books.History[?('Indian' in @.Tags)]. Попробовал их оба здесь.

person riyasvaliya    schedule 24.10.2018
comment
Для меня сработали Tags[?(@ == 'Indian')] != null (null вместо []). Я использую Newtonsoft.Json.Linq.JToken в С#, если кому-то это может пригодиться. - person Mariusz Schimke; 23.07.2019

Предположим, вы используете Goessner JSONPath (http://goessner.net/articles/JsonPath/): должно сработать:

$.Books.History[?(@.Tags.indexOf('Indian') != -1)]

Согласно сайту Goessner, вы можете использовать базовый JavaScript внутри фильтра ?(). Поэтому вы можете использовать функцию JavaScript indexOf, чтобы проверить, содержит ли ваш массив тегов тег «Индийский».

См. здесь рабочий пример с использованием этого тестера запросов JSONPath: http://www.jsonquerytool.com/sample/jsonpathfilterbyarraycontents< /а>

person Duncan    schedule 04.05.2015
comment
Это также работает с портом Java (github.com/jayway/JsonPath). Протестировано с версией 2.0.0. - person Rüdiger Schulz; 27.05.2015
comment
Привет @Duncan, можно ли проверить, повторяется ли какое-либо строковое значение в jsonPath, не могли бы вы помочь мне здесь stackoverflow.com/questions/40954727/ - person Swapnil Kotwal; 04.12.2016
comment
@RüdigerSchulz: я попробовал точно такой же JSON, как указано выше, с предложенным решением на Jayway JsonPath, версия 2.0.0, и это НЕ сработало. Он не выдает ошибки, но не возвращает никаких значений. В версии 2.3.0 выдается исключение: indexOf не закрывается должным образом, что является ошибкой. - person Aditya K; 22.05.2018

Вы пытались использовать underscoreJS? Вы можете получить индийские книги следующим образом:

var data = {"Books:"....};

var indianBooks = _.filter(data.Books.History, function(book) { return _.contains(book.Tags, "Indian"); })
person FredMi    schedule 04.05.2015