package com.jayway.jsonpath.old; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonObject; import com.jayway.jsonpath.BaseTest; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.Filter; import com.jayway.jsonpath.InvalidPathException; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Option; import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.internal.Utils; import com.jayway.jsonpath.spi.cache.LRUCache; import com.jayway.jsonpath.spi.json.GsonJsonProvider; import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider; import com.jayway.jsonpath.spi.json.JsonProvider; import com.jayway.jsonpath.spi.mapper.GsonMappingProvider; import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; import com.jayway.jsonpath.spi.mapper.MappingException; import net.minidev.json.JSONAware; import net.minidev.json.parser.JSONParser; import org.assertj.core.api.Assertions; import org.hamcrest.Matchers; import org.junit.Test; import java.io.InputStream; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.jayway.jsonpath.Criteria.PredicateContext; import static com.jayway.jsonpath.Criteria.where; import static com.jayway.jsonpath.Filter.filter; import static com.jayway.jsonpath.JsonPath.read; import static com.jayway.jsonpath.JsonPath.using; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; public class IssuesTest extends BaseTest { private static final JsonProvider jp = Configuration.defaultConfiguration().jsonProvider(); @Test public void issue_143() { String json = "{ \"foo\": { \"bar\" : \"val\" }, \"moo\": { \"cow\" : \"val\" } }"; Configuration configuration = Configuration.builder().options( Option.AS_PATH_LIST ).build(); List pathList = JsonPath.using(configuration).parse(json).read(JsonPath.compile("$.*.bar")); assertThat(pathList).containsExactly("$['foo']['bar']"); } @Test public void issue_114_a() { String json = "{ \"p\":{\n" + "\"s\": { \"u\": \"su\" }, \n" + "\"t\": { \"u\": \"tu\" }\n" + "}}"; List result = read(json, "$.p.['s', 't'].u"); assertThat(result).containsExactly("su","tu"); } @Test public void issue_114_b() { String json = "{ \"p\": [\"valp\", \"valq\", \"valr\"] }"; List result = read(json, "$.p[?(@ == 'valp')]"); assertThat(result).containsExactly("valp"); } @Test public void issue_114_c() { String json = "{ \"p\": [\"valp\", \"valq\", \"valr\"] }"; List result = read(json, "$.p[?(@[0] == 'valp')]"); assertThat(result).isEmpty(); } @Test(expected = InvalidPathException.class) public void issue_114_d() { read(JSON_BOOK_DOCUMENT, "$..book[(@.length-1)] "); } @Test public void issue_151() { String json = "{\n" + "\"datas\": {\n" + " \"selling\": {\n" + " \"3\": [\n" + " 26452067,\n" + " 31625950\n" + " ],\n" + " \"206\": [\n" + " 32381852,\n" + " 32489262\n" + " ],\n" + " \"208\": [\n" + " 458\n" + " ],\n" + " \"217\": [\n" + " 27364892\n" + " ],\n" + " \"226\": [\n" + " 30474109\n" + " ]\n" + " }\n" + "},\n" + "\"status\": 0\n" + "}"; List result = read(json, "$.datas.selling['3','206'].*"); assertThat(result).containsExactly(26452067,31625950,32381852,32489262); } @Test public void full_ones_can_be_filtered() { String json = "[\n" + " {\"kind\" : \"full\"},\n" + " {\"kind\" : \"empty\"}\n" + "]"; List> fullOnes = read(json, "$[?(@.kind == 'full')]"); assertEquals(1, fullOnes.size()); assertEquals("full", fullOnes.get(0).get("kind")); } @Test public void issue_36() { String json = "{\n" + "\n" + " \"arrayOfObjectsAndArrays\" : [ { \"k\" : [\"json\"] }, { \"k\":[\"path\"] }, { \"k\" : [\"is\"] }, { \"k\" : [\"cool\"] } ],\n" + "\n" + " \"arrayOfObjects\" : [{\"k\" : \"json\"}, {\"k\":\"path\"}, {\"k\" : \"is\"}, {\"k\" : \"cool\"}]\n" + "\n" + " }"; Object o1 = read(json, "$.arrayOfObjectsAndArrays..k "); Object o2 = read(json, "$.arrayOfObjects..k "); assertEquals("[[\"json\"],[\"path\"],[\"is\"],[\"cool\"]]", jp.toJson(o1)); assertEquals("[\"json\",\"path\",\"is\",\"cool\"]", jp.toJson(o2)); } @Test public void issue_11() throws Exception { String json = "{ \"foo\" : [] }"; List result = read(json, "$.foo[?(@.rel == 'item')][0].uri"); assertTrue(result.isEmpty()); } @Test(expected = PathNotFoundException.class) public void issue_11b() throws Exception { String json = "{ \"foo\" : [] }"; read(json, "$.foo[0].uri"); } @Test public void issue_15() throws Exception { String json = "{ \"store\": {\n" + " \"book\": [ \n" + " { \"category\": \"reference\",\n" + " \"author\": \"Nigel Rees\",\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"Herman Melville\",\n" + " \"title\": \"Moby Dick\",\n" + " \"isbn\": \"0-553-21311-3\",\n" + " \"price\": 8.99,\n" + " \"retailer\": null, \n" + " \"children\": true,\n" + " \"number\": -2.99\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"J. R. R. Tolkien\",\n" + " \"title\": \"The Lord of the Rings\",\n" + " \"isbn\": \"0-395-19395-8\",\n" + " \"price\": 22.99,\n" + " \"number\":0,\n" + " \"children\": false\n" + " }\n" + " ]\n" + " }\n" + "}"; List titles = read(json, "$.store.book[?(@.children==true)].title"); assertThat(titles, Matchers.contains("Moby Dick")); assertEquals(1, titles.size()); } @Test public void issue_24() { InputStream is = null; try { is = this.getClass().getResourceAsStream("/issue_24.json"); //Object o = JsonPath.read(is, "$.project[?(@.template.@key == 'foo')].field[*].@key"); Object o = read(is, "$.project.field[*].@key"); //Object o = JsonPath.read(is, "$.project.template[?(@.@key == 'foo')].field[*].@key"); is.close(); } catch (Exception e) { //e.printStackTrace(); Utils.closeQuietly(is); } } @Test public void issue_28_string() { String json = "{\"contents\": [\"one\",\"two\",\"three\"]}"; List result = read(json, "$.contents[?(@ == 'two')]"); assertThat(result, Matchers.contains("two")); assertEquals(1, result.size()); } @Test public void issue_37() { String json = "[\n" + " {\n" + " \"id\": \"9\",\n" + " \"sku\": \"SKU-001\",\n" + " \"compatible\": false\n" + " },\n" + " {\n" + " \"id\": \"13\",\n" + " \"sku\": \"SKU-005\",\n" + " \"compatible\": true\n" + " },\n" + " {\n" + " \"id\": \"11\",\n" + " \"sku\": \"SKU-003\",\n" + " \"compatible\": true\n" + " }\n" + "]"; List result = read(json, "$[?(@.compatible == true)].sku"); assertThat(result).containsExactly("SKU-005", "SKU-003"); } @Test public void issue_38() { String json = "{\n" + " \"datapoints\":[\n" + " [\n" + " 10.1,\n" + " 13.0\n" + " ],\n" + " [\n" + " 21.0,\n" + " 22.0\n" + " ]\n" + " ]\n" + "}"; List result = read(json, "$.datapoints.[*].[0]"); assertThat(result.get(0), is(new Double(10.1))); assertThat(result.get(1), is(new Double(21.0))); } @Test public void issue_39() { String json = "{\n" + " \"obj1\": {\n" + " \"arr\": [\"1\", \"2\"]\n" + " },\n" + " \"obj2\": {\n" + " \"arr\": [\"3\", \"4\"]\n" + " }\n" + "}\n"; List result = read(json, "$..arr"); assertThat(result.size(), is(2)); } @Test public void issue_28_int() { String json = "{\"contents\": [1,2,3]}"; List result = read(json, "$.contents[?(@ == 2)]"); assertThat(result, Matchers.contains(2)); assertEquals(1, result.size()); } @Test public void issue_28_boolean() { String json = "{\"contents\": [true, true, false]}"; List result = read(json, "$.contents[?(@ == true)]"); assertThat(result, Matchers.contains(true, true)); assertEquals(2, result.size()); } @Test(expected = PathNotFoundException.class) public void issue_22() throws Exception { Configuration configuration = Configuration.defaultConfiguration(); String json = "{\"a\":{\"b\":1,\"c\":2}}"; JsonPath.parse(json, configuration).read("a.d"); } @Test public void issue_22c() throws Exception { //Configuration configuration = Configuration.builder().build(); Configuration configuration = Configuration.builder().options(Option.SUPPRESS_EXCEPTIONS).build(); String json = "{\"a\":{\"b\":1,\"c\":2}}"; assertNull(JsonPath.parse(json, configuration).read("a.d")); } @Test public void issue_22b() throws Exception { String json = "{\"a\":[{\"b\":1,\"c\":2},{\"b\":5,\"c\":2}]}"; List res = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.DEFAULT_PATH_LEAF_TO_NULL)).parse(json).read("a[?(@.b==5)].d"); assertThat(res).hasSize(1).containsNull(); } @Test(expected = PathNotFoundException.class) public void issue_26() throws Exception { String json = "[{\"a\":[{\"b\":1,\"c\":2}]}]"; Object o = read(json, "$.a"); } @Test public void issue_29_a() throws Exception { String json = "{\"list\": [ { \"a\":\"atext\", \"b.b-a\":\"batext2\", \"b\":{ \"b-a\":\"batext\", \"b-b\":\"bbtext\" } }, { \"a\":\"atext2\", \"b\":{ \"b-a\":\"batext2\", \"b-b\":\"bbtext2\" } } ] }"; List> result = read(json, "$.list[?(@['b.b-a']=='batext2')]"); assertEquals(1, result.size()); Object a = result.get(0).get("a"); assertEquals("atext", a); result = read(json, "$.list[?(@.b.b-a=='batext2')]"); assertEquals(1, result.size()); assertEquals("atext2", result.get(0).get("a")); } @Test public void issue_29_b() throws Exception { String json = "{\"list\": [ { \"a\":\"atext\", \"b\":{ \"b-a\":\"batext\", \"b-b\":\"bbtext\" } }, { \"a\":\"atext2\", \"b\":{ \"b-a\":\"batext2\", \"b-b\":\"bbtext2\" } } ] }"; List result = read(json, "$.list[?]", filter(where("b.b-a").eq("batext2"))); assertTrue(result.size() == 1); } @Test public void issue_30() throws Exception { String json = "{\"foo\" : {\"@id\" : \"123\", \"$\" : \"hello\"}}"; assertEquals("123", read(json, "foo.@id")); assertEquals("hello", read(json, "foo.$")); } @Test public void issue_32() { String json = "{\"text\" : \"skill: \\\"Heuristic Evaluation\\\"\", \"country\" : \"\"}"; assertEquals("skill: \"Heuristic Evaluation\"", read(json, "$.text")); } @Test public void issue_33() { String json = "{ \"store\": {\n" + " \"book\": [ \n" + " { \"category\": \"reference\",\n" + " \"author\": {\n" + " \"name\": \"Author Name\",\n" + " \"age\": 36\n" + " },\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " { \"category\": \"fiction\",\n" + " \"author\": \"Evelyn Waugh\",\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99,\n" + " \"isbn\": \"0-553-21311-3\"\n" + " }\n" + " ],\n" + " \"bicycle\": {\n" + " \"color\": \"red\",\n" + " \"price\": 19.95\n" + " }\n" + " }\n" + "}"; List> result = read(json, "$.store.book[?(@.author.age == 36)]"); assertThat(result).hasSize(1); assertThat(result.get(0)).containsEntry("title", "Sayings of the Century"); } @Test public void array_root() { String json = "[\n" + " {\n" + " \"a\": 1,\n" + " \"b\": 2,\n" + " \"c\": 3\n" + " }\n" + "]"; assertEquals(1, read(json, "$[0].a")); } @Test(expected = PathNotFoundException.class) public void a_test() { String json = "{\n" + " \"success\": true,\n" + " \"data\": {\n" + " \"user\": 3,\n" + " \"own\": null,\n" + " \"passes\": null,\n" + " \"completed\": null\n" + " },\n" + " \"version\": 1371160528774\n" + "}"; Object read = read(json, "$.data.passes[0].id"); } @Test public void issue_42() { String json = "{" + " \"list\": [{" + " \"name\": \"My (String)\" " + " }] " + " }"; List> result = read(json, "$.list[?(@.name == 'My (String)')]"); assertThat(result).containsExactly(Collections.singletonMap("name", "My (String)")); } @Test public void issue_43() { String json = "{\"test\":null}"; assertThat(read(json, "test")).isNull(); assertThat(JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.SUPPRESS_EXCEPTIONS)).parse(json).read("nonExistingProperty")).isNull(); try { read(json, "nonExistingProperty"); failBecauseExceptionWasNotThrown(PathNotFoundException.class); } catch (PathNotFoundException e) { } try { read(json, "nonExisting.property"); failBecauseExceptionWasNotThrown(PathNotFoundException.class); } catch (PathNotFoundException e) { } } @Test public void issue_45() { String json = "{\"rootkey\":{\"sub.key\":\"value\"}}"; assertThat(read(json, "rootkey['sub.key']")).isEqualTo("value"); } @Test public void issue_46() { String json = "{\"a\": {}}"; Configuration configuration = Configuration.defaultConfiguration().setOptions(Option.SUPPRESS_EXCEPTIONS); assertThat(JsonPath.using(configuration).parse(json).read("a.x")).isNull(); try { read(json, "a.x"); failBecauseExceptionWasNotThrown(PathNotFoundException.class); } catch (PathNotFoundException e) { assertThat(e).hasMessage("No results for path: $['a']['x']"); } } @Test public void issue_x() { String json = "{\n" + " \"a\" : [\n" + " {},\n" + " { \"b\" : [ { \"c\" : \"foo\"} ] }\n" + " ]\n" + "}\n"; List result = read(json, "$.a.*.b.*.c"); assertThat(result).containsExactly("foo"); } @Test public void issue_60() { String json = "[\n" + "{\n" + " \"mpTransactionId\": \"542986eae4b001fd500fdc5b-coreDisc_50-title\",\n" + " \"resultType\": \"FAIL\",\n" + " \"narratives\": [\n" + " {\n" + " \"ruleProcessingDate\": \"Nov 2, 2014 7:30:20 AM\",\n" + " \"area\": \"Discovery\",\n" + " \"phase\": \"Validation\",\n" + " \"message\": \"Chain does not have a discovery event. Possible it was cut by the date that was picked\",\n" + " \"ruleName\": \"Validate chain\\u0027s discovery event existence\",\n" + " \"lastRule\": true\n" + " }\n" + " ]\n" + "},\n" + "{\n" + " \"mpTransactionId\": \"54298649e4b001fd500fda3e-fixCoreDiscovery_3-title\",\n" + " \"resultType\": \"FAIL\",\n" + " \"narratives\": [\n" + " {\n" + " \"ruleProcessingDate\": \"Nov 2, 2014 7:30:20 AM\",\n" + " \"area\": \"Discovery\",\n" + " \"phase\": \"Validation\",\n" + " \"message\": \"There is one and only discovery event ContentDiscoveredEvent(230) found.\",\n" + " \"ruleName\": \"Marks existence of discovery event (230)\",\n" + " \"lastRule\": false\n" + " },\n" + " {\n" + " \"ruleProcessingDate\": \"Nov 2, 2014 7:30:20 AM\",\n" + " \"area\": \"Discovery/Processing\",\n" + " \"phase\": \"Validation\",\n" + " \"message\": \"Chain does not have SLA start event (204) in Discovery or Processing. \",\n" + " \"ruleName\": \"Check if SLA start event is not present (204). \",\n" + " \"lastRule\": false\n" + " },\n" + " {\n" + " \"ruleProcessingDate\": \"Nov 2, 2014 7:30:20 AM\",\n" + " \"area\": \"Processing\",\n" + " \"phase\": \"Transcode\",\n" + " \"message\": \"No start transcoding events found\",\n" + " \"ruleName\": \"Start transcoding events missing (240)\",\n" + " \"lastRule\": true\n" + " }\n" + " ]\n" + "}]"; List problems = read(json, "$..narratives[?(@.lastRule==true)].message"); assertThat(problems).containsExactly("Chain does not have a discovery event. Possible it was cut by the date that was picked", "No start transcoding events found"); } //http://stackoverflow.com/questions/28596324/jsonpath-filtering-api @Test public void stack_overflow_question_1() { String json = "{\n" + "\"store\": {\n" + " \"book\": [\n" + " {\n" + " \"category\": \"reference\",\n" + " \"authors\" : [\n" + " {\n" + " \"firstName\" : \"Nigel\",\n" + " \"lastName\" : \"Rees\"\n" + " }\n" + " ],\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"authors\": [\n" + " {\n" + " \"firstName\" : \"Evelyn\",\n" + " \"lastName\" : \"Waugh\"\n" + " },\n" + " {\n" + " \"firstName\" : \"Another\",\n" + " \"lastName\" : \"Author\"\n" + " }\n" + " ],\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99\n" + " }\n" + " ]\n" + " }\n" + "}"; Filter filter = filter(where("authors[*].lastName").contains("Waugh")); Object read = JsonPath.parse(json).read("$.store.book[?]", filter); } @Test public void issue_71() { String json = "{\n" + " \"logs\": [\n" + " {\n" + " \"message\": \"it's here\",\n" + " \"id\": 2\n" + " }\n" + " ]\n" + "}"; List result = read(json, "$.logs[?(@.message == 'it\\'s here')].message"); assertThat(result).containsExactly("it's here"); } @Test public void issue_76() throws Exception { String json = "{\n" + " \"cpus\": -8.88178419700125e-16,\n" + " \"disk\": 0,\n" + " \"mem\": 0\n" + "}"; JSONParser parser = new JSONParser(JSONParser.MODE_PERMISSIVE); JSONAware jsonModel = (JSONAware) parser.parse(json); jsonModel.toJSONString(); } @Test public void issue_79() throws Exception { String json = "{ \n" + " \"c\": {\n" + " \"d1\": {\n" + " \"url\": [ \"url1\", \"url2\" ]\n" + " },\n" + " \"d2\": {\n" + " \"url\": [ \"url3\", \"url4\",\"url5\" ]\n" + " }\n" + " }\n" + "}"; List res = read(json, "$.c.*.url[2]"); assertThat(res).containsExactly("url5"); } @Test public void issue_94_1() throws Exception { LRUCache cache = new LRUCache(200); JsonPath dummy = JsonPath.compile("$"); for (int i = 0; i < 1000; ++i) { String key = String.valueOf(i); cache.get(key); cache.put(key, dummy); } assertThat(cache.size()).isEqualTo(200); } @Test public void issue_94_2() throws Exception { LRUCache cache = new LRUCache(5); JsonPath dummy = JsonPath.compile("$"); cache.put("1", dummy); cache.put("2", dummy); cache.put("3", dummy); cache.put("4", dummy); cache.put("5", dummy); cache.put("6", dummy); cache.get("1"); cache.get("2"); cache.get("3"); cache.get("4"); cache.get("5"); cache.get("6"); cache.get("2"); cache.get("3"); cache.get("4"); cache.get("5"); cache.get("6"); cache.get("3"); cache.get("4"); cache.get("5"); cache.get("6"); cache.get("4"); cache.get("5"); cache.get("6"); cache.get("5"); cache.get("6"); cache.get("6"); assertThat(cache.getSilent("6")).isNotNull(); assertThat(cache.getSilent("5")).isNotNull(); assertThat(cache.getSilent("4")).isNotNull(); assertThat(cache.getSilent("3")).isNotNull(); assertThat(cache.getSilent("2")).isNotNull(); assertThat(cache.getSilent("1")).isNull(); } @Test public void issue_97() throws Exception { String json = "{ \"books\": [ " + "{ \"category\": \"fiction\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"fiction\" }, " + "{ \"category\": \"fiction\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"fiction\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"reference\" }, " + "{ \"category\": \"reference\" } ] }"; Configuration conf = Configuration.builder() .jsonProvider(new GsonJsonProvider()) .mappingProvider(new GsonMappingProvider()) .build(); DocumentContext context = JsonPath.using(conf).parse(json); context.delete("$.books[?(@.category == 'reference')]"); List categories = context.read("$..category", List.class); assertThat(categories).containsOnly("fiction"); } @Test public void issue_99() throws Exception { String json = "{\n" + " \"array1\": [\n" + " {\n" + " \"array2\": []\n" + " },\n" + " {\n" + " \"array2\": [\n" + " {\n" + " \"key\": \"test_key\"\n" + " }\n" + " ]\n" + " }\n" + " ]\n" + "}"; Configuration configuration = Configuration.defaultConfiguration().addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL); List keys = JsonPath.using(configuration).parse(json).read("$.array1[*].array2[0].key"); } @Test public void issue_129() throws Exception { final Map match = new HashMap(); match.put("a", 1); match.put("b", 2); Map noMatch = new HashMap(); noMatch.put("a", -1); noMatch.put("b", -2); Filter orig = filter(where("a").eq(1).and("b").eq(2)); String filterAsString = orig.toString(); Filter parsed = Filter.parse(filterAsString); assertThat(orig.apply(createPredicateContext(match))).isTrue(); assertThat(parsed.apply(createPredicateContext(match))).isTrue(); assertThat(orig.apply(createPredicateContext(noMatch))).isFalse(); assertThat(parsed.apply(createPredicateContext(noMatch))).isFalse(); } private PredicateContext createPredicateContext(final Map map){ return new PredicateContext() { @Override public Object item() { return map; } @Override public T item(Class clazz) throws MappingException { return (T)map; } @Override public Object root() { return map; } @Override public Configuration configuration() { return Configuration.defaultConfiguration(); } }; } @Test public void issue_131() { String json = "[\n" + " {\n" + " \"foo\": \"1\"\n" + " },\n" + " {\n" + " \"foo\": null\n" + " },\n" + " {\n" + " \"xxx\": null\n" + " }\n" + "]"; List> result = read(json, "$[?(@.foo)]"); assertThat(result).extracting("foo").containsExactly("1", null); } @Test public void issue_131_2() { String json = "[\n" + " {\n" + " \"foo\": { \"bar\" : \"0\"}\n" + " },\n" + " {\n" + " \"foo\": null\n" + " },\n" + " {\n" + " \"xxx\": null\n" + " }\n" + "]"; List result = read(json, "$[?(@.foo != null)].foo.bar"); assertThat(result).containsExactly("0"); result = read(json, "$[?(@.foo.bar)].foo.bar"); assertThat(result).containsExactly("0"); } @Test public void issue_131_3() { String json = "[\n" + " 1,\n" + " 2,\n" + " {\n" + " \"d\": {\n" + " \"random\": null,\n" + " \"date\": 1234\n" + " },\n" + " \"l\": \"filler\"\n" + " }\n" + "]"; List result = read(json, "$[2]['d'][?(@.random)]['date']"); assertThat(result).containsExactly(1234); } //https://groups.google.com/forum/#!topic/jsonpath/Ojv8XF6LgqM @Test public void using_square_bracket_literal_path() { String json = "{ \"valid key[@num = 2]\" : \"value\" }"; String result = read(json, "$['valid key[@num = 2]']"); Assertions.assertThat(result).isEqualTo("value"); } @Test public void issue_90() { String json = "{\n" + " \"store\": {\n" + " \"book\": [\n" + " {\n" + " \"price\": \"120\"\n" + " },\n" + " {\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"price\": 12.99\n" + " },\n" + " {\n" + " \"price\": 8.99\n" + " },\n" + " {\n" + " \"price\": 22.99\n" + " }\n" + " ]\n" + " },\n" + " \"expensive\": 10\n" + "}"; List numbers = read(json, "$.store.book[?(@.price <= 90)].price"); assertThat(numbers).containsExactly(8.95D, 12.99D, 8.99D, 22.99D); } @Test(expected = PathNotFoundException.class) public void github_89() { com.google.gson.JsonObject json = new JsonObject(); json.addProperty("foo", "bar"); JsonPath path = JsonPath.compile("$.foo"); String object = path.read(json); } @Test public void issue_170() { String json = "{\n" + " \"array\": [\n" + " 0,\n" + " 1,\n" + " 2\n" + " ]\n" + "}"; DocumentContext context = using(JACKSON_JSON_NODE_CONFIGURATION).parse(json); context = context.set("$.array[0]", null); context = context.set("$.array[2]", null); List list = context.read("$.array", List.class); assertThat(list).containsExactly(null, 1, null); } @Test public void issue_171() { String json = "{\n" + " \"can delete\": \"this\",\n" + " \"can't delete\": \"this\"\n" + "}"; DocumentContext context = using(JACKSON_JSON_NODE_CONFIGURATION).parse(json); context.set("$.['can delete']", null); context.set("$.['can\\'t delete']", null); ObjectNode objectNode = context.read("$"); assertThat(objectNode.get("can delete").isNull()); assertThat(objectNode.get("can't delete").isNull()); } @Test public void issue_309(){ String json = "{\n" + "\"jsonArr\": [\n" + " {\n" + " \"name\":\"nOne\"\n" + " },\n" + " {\n" + " \"name\":\"nTwo\"\n" + " }\n" + " ]\n" + "}"; DocumentContext doc = JsonPath.parse(json).set("$.jsonArr[1].name", "Jayway"); assertThat(doc.read("$.jsonArr[0].name")).isEqualTo("nOne"); assertThat(doc.read("$.jsonArr[1].name")).isEqualTo("Jayway"); } @Test public void issue_378(){ String json = "{\n" + " \"nodes\": {\n" + " \"unnamed1\": {\n" + " \"ntpServers\": [\n" + " \"1.2.3.4\"\n" + " ]\n" + " }\n" + " }\n" + "}"; Configuration configuration = Configuration.builder() .jsonProvider(new JacksonJsonNodeJsonProvider()) .mappingProvider(new JacksonMappingProvider()) .build(); DocumentContext ctx = JsonPath.using(configuration).parse(json); String path = "$.nodes[*][?(!([\"1.2.3.4\"] subsetof @.ntpServers))].ntpServers"; JsonPath jsonPath = JsonPath.compile(path); ctx.read(jsonPath); } }