jsonpath源码分析

1,405 阅读1分钟

jsonpath 用于json字符串的解析,同xpath一样,通过路径的方式获取json某个对象的值。

jsonpath 使用非常简单, 常用的两个方法:

DocumentContext parse = JsonPath.parse(result);
parse.read("$.data.result[0].title")

首先它把字符串转成Json对象, 查找时,先把查找字符串转成PathToken对象,然后再Json对象中遍历查找。

有图,有真相

我们分析一下这两个函数的源码。

1. JsonPath.parse()

源码很简单,把json串用三方的json包解析成json对象, 包装到JsonContext中

    class JsonPath
    public static DocumentContext parse(String json) {
        return new ParseContextImpl().parse(json);
    }
    class ParseContextImpl
    public DocumentContext parse(String json) {
        Object obj = configuration.jsonProvider().parse(json);
        return new JsonContext(obj, configuration);
    }

  

2.parse.read("$.data.result[0].title"),

先看几个重要的类,CompiledPath(查找入口及查找value 存放类),PathRef(Json对象包装类),PathToken(查找的路径包装类)

PathRef 及子类

PathToken 及子类来实现各种的路径(RootPathToken 查找的根路径对,PropertyPathToken key-value解析对象)

CompilePath 解析的时候,用几个辅助类, PathCompiler, CharacterIndex(字符串逐字母读取)

PathCompiler: 字符串解析类

readNextToken() 读取下一个

CompiledPath evaluate():

EvaluationContextImpl 中 root ,rootDocument 是Json对象.

如果是叶子结点,就添加到model 到 EvaluationContextImpl ,如果不是,就next 取下一个PathToken, 解析.