`

使用json-path解析json

阅读更多

    在我们的日常开发中,有时候需要从一个json字符串中获取一个值,或者从一段json字符串中获取到某些值,如果先使用Gson或Jackson转换成java对象在获取值,有些时候是很麻烦的,那么有没有一种根据表达式提取json中的数据的方式呢,就像使用xpath语法操作xml文件一样,答案是有的,jsonPath就是这样的一个在java中操作json的简单工具。

   jsonPath的在github上的网址如下:https://github.com/json-path/JsonPath

一、json-path中的操作符

 

二、json-path中可以使用的函数

 

三、过滤操作符

 四、表达式使用示例:

 1、数据准备

{
    "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
        }
    },
    "expensive": 10
}

 2、示例代码



 五、在JAVA代码中使用

1、pom.xml文件中引入json-path的依赖

<dependency>
	<groupId>com.jayway.jsonpath</groupId>
	<artifactId>json-path</artifactId>
	<version>2.4.0</version>
</dependency>

 2、编写代码

package com.huan.json;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.jayway.jsonpath.spi.json.JsonProvider;

/**
 * 测试jsonpath的使用
 * 
 * @描述
 * @作者 huan
 * @时间 2017年12月31日 - 下午4:34:11
 */
public class JsonPathTest {
	public static void main(String[] args) {
		String json = readJson();
		Configuration configuration = Configuration.defaultConfiguration();
		configuration = configuration.addOptions(//
				Option.DEFAULT_PATH_LEAF_TO_NULL, // 如果路径不存在则返回null,而不要抛出PathNotFoundException
				Option.SUPPRESS_EXCEPTIONS // 抑制异常的抛出,当设置了Option.ALWAYS_RETURN_LIST时返回[],否则返回null
		);
		// 如果项目中存在gson则此处可以new 一个GsonJsonProvider,那么返回对象
		// configuration.jsonProvider(new GsonJsonProvider());
		JsonProvider jsonProvider = configuration.jsonProvider();
		/**
		 * 此处预先解析json,默认请情下JsonPath.read方法每掉一次都会重新解析json,此处预先解析好就不用每次都进行解析
		 */
		Object document = jsonProvider.parse(json);
		// 1.获取所有book中的author
		List<String> authors = JsonPath.read(document, "$.store.book[*].author");
		System.out.println(authors);
		// 2.获取价格比$.expensive大的书籍
		List<Map<String, Object>> books = JsonPath.read(document, "$.store.book[?(@.price > $.expensive)]");
		System.out.println(books);
		// 3.输出一个不存在的表达式,因为存在这个选项的配置,所有返回的是Option.DEFAULT_PATH_LEAF_TO_NULL
		Object notExistsValue = JsonPath.using(configuration).parse(document).read("$.not-exists-path.path");
		System.out.println(notExistsValue);
		// 4.存在多级属性缺失
		Object object = JsonPath.using(configuration).parse(document).read("$.not-exists.path");
		System.out.println(object);
	}

	public static String readJson() {
		StringBuilder builder = new StringBuilder();
		try (InputStream is = JsonPathTest.class.getResourceAsStream("data.json"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);) {
			String line;
			while (null != (line = br.readLine())) {
				builder.append(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return builder.toString();
	}

}

 3、结果

 

六、注意事项:

      1、在json-path的filter中 1 和 '1' 是不相等的。

      2、filter中的字符串需要使用单引号或双引号括起来

      3、JsonPath.read方法会每次进行json的解析,解决思路就是预先解析json

      4、Option中提供了一些枚举值可以控制解析的结果返回

      5、如果不想使用默认的JsonProvider则可以自己提供一个。

 

七、完整的思维导图见附件中。
 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 53 KB
  • 大小: 42.7 KB
  • 大小: 71.1 KB
  • 大小: 71.5 KB
  • 大小: 65.3 KB
分享到:
评论

相关推荐

    前端开源库-json-path

    这个开源库——`json-path`,是专为Node.js和现代浏览器设计的,使得在JavaScript环境中操作JSON数据变得简单易行。 在前端开发中,数据交互通常涉及JSON格式,而`json-path`库提供了强大且灵活的查询功能。通过...

    jsonPath所需jar包(json-path-0.8.1.jar,json-smart-1.1.1.jar,commons-lang-2.6.jar)

    本压缩包包含了JSONPath操作所需的三个关键jar包:`json-path-0.8.1.jar`、`json-smart-1.1.1.jar`和`commons-lang-2.6.jar`。 `json-path-0.8.1.jar`是JSONPath的主要实现库,它提供了丰富的API来查询和提取JSON...

    json-path-assert-2.1.0.zip

    接着,你可以使用JSON Path表达式来定位和提取AST中的特定数据,并结合断言库(如在json-path-assert-2.1.0中提供的)来确保提取的数据符合预期。 总的来说,这个压缩包为处理JSON数据提供了一个强大的工具集,特别...

    json-lib-2.4 jar 程序文件

    JSON-Lib是Java平台上的一个库,它提供了处理JSON数据的API,使得在Java中生成、解析和操作JSON对象变得简单。本文将详细介绍`json-lib-2.4 jar`程序文件及其在Java开发中的应用。 `json-lib-2.4 jar`是JSON-Lib的...

    前端开源库-json-literal

    因此,json-literal库可能是为了解决标准JSON的一些限制,提供了更丰富的功能或者更便捷的使用方式,比如支持更复杂的数据结构,或者提供更友好的语法糖。 基于这个库的“前端开源”标签,我们可以推断它是用于...

    json--jar包

    `json--jar包`可能是指一个包含处理JSON的Java库,如Gson、Jackson或org.json等。 1. **Gson库**:Google提供的Gson库允许开发者将Java对象转化为JSON字符串,同时也能将JSON文本解析回对应的Java对象。例如,你...

    Node.js-load-json-file-读取和解析JSON文件

    `load-json-file`的核心功能在于,它不仅读取文件内容,还会自动将内容解析为JavaScript对象,这样开发者就不必分步骤地先读取文件,再手动解析JSON字符串。这简化了代码,减少了出错的可能性。 使用`load-json-...

    json-processing-webapp

    在这个“json-processing-webapp”项目中,我们可能涉及到一系列与JSON解析、生成、以及在Web应用中使用相关的知识点。 1. JSON格式理解:JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    PyPI 官网下载 | json-extensions-0.2.1.tar.gz

    如果使用的是现代的Python环境管理工具如`pip`,则可以使用`pip install path/to/json-extensions-0.2.1.tar.gz`来安装。 在实际开发中,`json-extensions`这样的库能够帮助开发者更高效、更安全地处理JSON数据,...

    java 解析 json文件 java 解析 json文件

    使用JSON-P和JSON-B通常涉及到更多的代码,因为它们不提供自动绑定到Java对象的功能。你需要手动创建`JsonReader`或`JsonWriter`实例,然后逐个处理JSON节点。这里不再详述,但你可以在官方文档中找到更多关于这两个...

    json-jar.zip

    本压缩包“json-jar.zip”包含了处理JSON数据的一整套jar包,共计六个,这些jar包包含了JSON解析和操作所需的所有依赖,因此可以直接在项目中导入使用,无需额外配置其他依赖,极大地简化了开发过程。 1. **JSON...

    前端开源库-json-ptr

    在实际开发中,JSON-PTR常用于数据验证、API响应解析、JSON配置文件操作等场景。比如,你可能有一个复杂的JSON配置文件,需要根据用户输入的指针动态调整配置。或者在处理API返回的数据时,可以使用JSON-PTR快速定位...

    echarts-mapJson-master2018.zip

    在ECharts-mapJson-master资源包中,"全国地图echarts-mapJson-master"目录下,很可能包含了中国各个省份、城市、甚至区县的JSON文件,每个文件对应一个行政区域,数据结构严谨,便于ECharts解析和渲染。 使用...

    json工具包(commons-xxx.jar,ezmorph-xxx.jar,json-xxx.jar)

    3. `json-xxx.jar`:这个jar包可能是某个具体的JSON解析库,如Gson、Jackson、org.json或json-simple等。这些库提供了在Java对象和JSON字符串之间的相互转换功能,使得开发者可以轻松地将Java对象写入JSON格式,或者...

    hive解析json格式数据所需jar包

    hive解析json时所需jar包。具体使用: add jar ../../../target/json-serde-1.3-jar-with-dependencies.jar; CREATE TABLE json_nested_test ( country string, languages array, religions map,array&lt;int&gt;&gt;) ...

    Laravel开发-json-schema-validator

    通过使用laravel-json-schema-validator,你可以将JSON Schema定义的验证规则与Laravel的验证系统无缝对接。这使得你可以快速地验证复杂的数据结构,而无需编写大量的验证规则。 要使用这个库,首先需要在你的项目...

    json-path-examples

    在Java中,最常用的JsonPath库是`com.jayway.jsonpath:json-path`,它提供了丰富的API来解析和操作JSON。 以下是一些核心JsonPath概念和用法: 1. **基本查询**: - `$.key`:选择JSON对象中的键为`key`的值。 -...

    logstash-codec-json-lines-main.tar.gz

    这个压缩包 "logstash-codec-json-lines-main.tar.gz" 提供的是 Logstash 的一个插件,名为 "json_lines" 编解码器。这个编解码器主要用于解析和生成 JSON 格式的数据流,特别是那些每行包含一个完整 JSON 对象的...

    Laravel开发-json-routes

    ### JSON-Routes的优势 1. **代码分离**:将路由配置从PHP代码中分离出来,使得应用的结构更加清晰,更便于维护。 2. **自动化**:JSON格式的数据易于解析,可以方便地与脚本或构建工具集成,实现自动化的路由生成和...

Global site tag (gtag.js) - Google Analytics