Java笔记:使用jsonpath解析json文件

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

1、添加pom依赖

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
</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<br/>
     *     示例:<br/>
     *          $.store.book[*].author<br/>
     *          $.store.book[0].author
     * @param <T>
     * @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<String> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值