使用jsonpath对json文件解析

读取classes根目录下的config.json文件

1、添加pom依赖

<dependency>
    <groupId>com.jayway.jsonpathgroupId>
    <artifactId>json-pathartifactId>
    <version>2.2.0version>
dependency>

2、封装类

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.List;

@Slf4j
public class Config {

    private static String fileContent;
    private static Object document = null;

    static {
        try (InputStream in = Config.class.getResourceAsStream("/config.json")) {
            fileContent = readStream(in);
            document = Configuration.defaultConfiguration().jsonProvider().parse(fileContent);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
    }

    private Config() {
    }

    /**
     * @param pattern jsonpath
* 示例:
* $.store.book[*].author
* $.store.book[0].author * @param * @return */
public static <T> T get(String pattern) { return JsonPath.read(document, pattern); } /** * 读取 InputStream 到 String字符串中 */ private static String readStream(InputStream in) { try { //<1>创建字节数组输出流,用来输出读取到的内容 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //<2>创建缓存大小 byte[] buffer = new byte[1024]; // 1KB //每次读取到内容的长度 int len = -1; //<3>开始读取输入流中的内容 while ((len = in.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了 baos.write(buffer, 0, len); //把读取到的内容写到输出流中 } //<4> 把字节数组转换为字符串 String content = baos.toString(); //<5>关闭输入流和输出流 in.close(); baos.close(); //<6>返回字符串结果 return content; } catch (Exception e) { e.printStackTrace(); return e.getMessage(); } } public static void main(String[] args) throws IOException { String json = "{\n" + " \"store\": {\n" + " \"book\": [\n" + " {\n" + " \"category\": \"reference\",\n" + " \"author\": \"NigelRees\",\n" + " \"title\": \"SayingsoftheCentury\",\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"EvelynWaugh\",\n" + " \"title\": \"SwordofHonour\",\n" + " \"price\": 12.99\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"HermanMelville\",\n" + " \"title\": \"MobyDick\",\n" + " \"isbn\": \"0-553-21311-3\",\n" + " \"price\": 8.99\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"J.R.R.Tolkien\",\n" + " \"title\": \"TheLordoftheRings\",\n" + " \"isbn\": \"0-395-19395-8\",\n" + " \"price\": 22.99\n" + " }\n" + " ],\n" + " \"bicycle\": {\n" + " \"color\": \"red\",\n" + " \"price\": 19.95\n" + " }\n" + " },\n" + " \"expensive\": 10\n" + "}"; // 用法1 List<String> authors = JsonPath.read(json, "$.store.book[*].author"); System.out.println(authors); // 用法2。如果你还想读取其他路径,现在上面不是很好的方法,因为他每次获取都需要再解析整个文档。所以,我们可以先解析整个文档,再选择调用路径。 Object document = Configuration.defaultConfiguration().jsonProvider().parse(json); String author0 = JsonPath.read(document, "$.store.book[0].author"); String author1 = JsonPath.read(document, "$.store.book[1].author"); System.out.println(author0); System.out.println(author1); // 用法3。当在java中使用JsonPath时,重要的是要知道你在结果中期望什么类型。 JsonPath将自动尝试将结果转换为调用者预期的类型。 // 抛出 java.lang.ClassCastException 异常 // List list = JsonPath.parse(json).read("$.store.book[0].author"); // 正常 // String author = JsonPath.parse(json).read("$.store.book[0].author"); // 用法4:默认情况下,MappingProvider SPI提供了一个简单的对象映射器。 这允许您指定所需的返回类型,MappingProvider将尝试执行映射。 在下面的示例中,演示了Long和Date之间的映射。 // //String json = "{\"date_as_long\" : 1411455611975}"; //Date date = JsonPath.parse(json).read("$['date_as_long']", Date.class); // (5) // 如果您将JsonPath配置为使用JacksonMappingProvider或GsonMappingProvider,您甚至可以将JsonPath输出直接映射到POJO中。 // Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class); } }

3、调用示例

String orgCode = Config.get("$.commandSys.rootDirectOrg.jz");

4、参考

jsonpath使用:http://www.ibloger.net/article/2329.html

你可能感兴趣的:(工具)