根据JSONPATH中数组中的字符串过滤Json。

6

我有一个情况,我有一个包含只有字符串的数组的子元素的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字符串中,需要获取所有包含“Indian”在“tags”列表中的历史书籍。
我正在我的项目中使用JSONPATH,但如果有其他API可以提供类似的功能,欢迎任何帮助。
3个回答

12
如果您正在使用Goessner JSONPath,如Duncan在上面提到的那样,$.Books.History[?(@.Tags.indexOf('Indian') != -1)]应该可以工作。
如果您正在使用Jayway Java端口(github.com/jayway/JsonPath),那么$.Books.History[?(@.Tags[?(@ == 'Indian')] != [])]或者更加优雅的方式是使用in操作符,像这样:$.Books.History[?('Indian' in @.Tags)]。在这里尝试了两种方法。

2
对我来说,Tags[?(@ == 'Indian')] != null 工作了(使用 null 而不是 [])。如果有人需要的话,我在 C# 中使用 Newtonsoft.Json.Linq.JToken。 - Mariusz Schimke

7
假设您正在使用Goessner JSONPath(http://goessner.net/articles/JsonPath/),以下内容应该可以正常工作:
$.Books.History[?(@.Tags.indexOf('Indian') != -1)]

根据Goessner网站的说法,您可以在?()过滤器中使用基础JavaScript。因此,您可以使用JavaScript的indexOf函数来检查您的Tags数组是否包含标签“Indian”。
在此处可以查看一个工作示例,使用此JSONPath查询测试器: http://www.jsonquerytool.com/sample/jsonpathfilterbyarraycontents

这也适用于Java端口(https://github.com/jayway/JsonPath)。已经测试过2.0.0版本。 - Rüdiger Schulz
嘿@Duncan,能否检查jsonPath中是否有任何字符串值重复?你能帮我吗?http://stackoverflow.com/questions/40954727/check-if-any-value-in-jsonpath-is-repeated - Swapnil Kotwal
@RüdigerSchulz:我尝试了上面提供的确切JSON解决方案,使用Jayway JsonPath 2.0.0版本,但它并没有起作用。它不会报错,但也不返回任何值。在2.3.0版本中,它会抛出一个异常,“'indexOf'未正确关闭”,这是一个错误。 - Aditya K

0
你尝试使用underscoreJS了吗?你可以这样获取印度书籍:
var data = {"Books:"....};

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

我会假设 OP 正在使用 Java(尽管不是很清楚)。 - DownloadPizza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接