All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jayway.jsonpath.JsonPath Maven / Gradle / Ivy

There is a newer version: 2.9.0
Show newest version
package com.jayway.jsonpath;


import com.jayway.jsonpath.reader.PathToken;
import com.jayway.jsonpath.reader.PathTokenizer;
import com.jayway.jsonpath.spi.JsonProvider;

import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * User: kalle stenflo
 * Date: 2/2/11
 * Time: 1:03 PM
 * 

* JsonPath is to JSON what XPATH is to XML, a simple way to extract parts of a given document. JsonPath is * available in many programming languages such as Javascript, Python and PHP. *

* JsonPath allows you to compile a json path string to use it many times or to compile and apply in one * single on demand operation. *

* Given the Json document: *

* * String json = * "{ * "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 * } * ], * "bicycle": * { * "color": "red", * "price": 19.95 * } * } * }"; * *

* A JsonPath can be compiled and used as shown: *

* * JsonPath path = JsonPath.compile("$.store.book[1]"); *
* List<Object> books = path.read(json); *
*

* Or: *

* * List<Object> authors = JsonPath.read(json, "$.store.book[*].author") * *

* If the json path returns a single value (is definite): *

* * String author = JsonPath.read(json, "$.store.book[1].author") * */ public class JsonPath { private static Pattern DEFINITE_PATH_PATTERN = Pattern.compile(".*(\\.\\.|\\*|\\[[\\\\/]|\\?|,|:\\s?\\]|\\[\\s?:|>|\\(|<|=|\\+).*"); private PathTokenizer tokenizer; private JsonProvider jsonProvider; /** * Creates a new JsonPath. * * @param jsonPath the path statement */ private JsonPath(String jsonPath) { this(JsonProvider.getInstance(), jsonPath); } private JsonPath(JsonProvider jsonProvider, String jsonPath) { if (jsonPath == null || jsonPath.trim().isEmpty() || jsonPath.matches("new ") || jsonPath.matches("[^\\?\\+\\=\\-\\*\\/\\!]\\(")) { throw new InvalidPathException("Invalid path"); } this.jsonProvider = jsonProvider; this.tokenizer = new PathTokenizer(jsonPath, jsonProvider); } public String getPath() { return this.tokenizer.getPath(); } /** * Checks if a path points to a single item or if it potentially returns multiple items *

* a path is considered not definite if it contains a scan fragment ".." * or an array position fragment that is not based on a single index *

*

* definite path examples are: *

* $store.book * $store.book[1].title *

* not definite path examples are: *

* $..book * $.store.book[1,2] * $.store.book[?(@.category = 'fiction')] * * @return true if path is definite (points to single item) */ public boolean isPathDefinite() { //return !getPath().replaceAll("\"[^\"\\\\\\n\r]*\"", "").matches(".*(\\.\\.|\\*|\\[[\\\\/]|\\?|,|:\\s?\\]|\\[\\s?:|>|\\(|<|=|\\+).*"); String preparedPath = getPath().replaceAll("\"[^\"\\\\\\n\r]*\"", ""); return !DEFINITE_PATH_PATTERN.matcher(preparedPath).matches(); } /** * Applies this container path to the provided object * * @param container a container Object * @param * @return list of objects matched by the given path */ public T read(Object container) { if (!(container instanceof Map) && !(container instanceof List)) { throw new IllegalArgumentException("Invalid container object"); } Object result = container; for (PathToken pathToken : tokenizer) { result = pathToken.filter(result, jsonProvider); } return (T) result; } /** * Applies this json path to the provided object * * @param json a json string * @param * @return list of objects matched by the given path */ public T read(String json) { return (T) read(jsonProvider.parse(json)); } /** * Compiles a JsonPath from the given string * * @param jsonPath to compile * @return compiled JsonPath */ public static JsonPath compile(String jsonPath) { return new JsonPath(jsonPath); } public static JsonPath compile(JsonProvider provider, String jsonPath) { return new JsonPath(provider, jsonPath); } /** * Creates a new JsonPath and applies it to the provided Json string * * @param json a json string * @param jsonPath the json path * @param * @return list of objects matched by the given path */ public static T read(String json, String jsonPath) { return (T) compile(jsonPath).read(json); } /** * Creates a new JsonPath and applies it to the provided Json object * * @param json a json object * @param jsonPath the json path * @param * @return list of objects matched by the given path */ public static T read(Object json, String jsonPath) { return (T) compile(jsonPath).read(json); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy