首页 > 技术文章 > jsonpath源码分析

songsh 2020-03-29 18:08 原文

今天有时间把jayway.jsonpath源码看了一遍,记录下来。

jsonpath 使用非常简单, 常用的 JsonPath.parse(str),   root.read('/root/').  首先它把文档字符串转成JsonObject,  在查找时,先把查找字符串转成PathToken对象,然后再查找。

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

1。 JsonPath.parse 源码很简单,  把json 串用三方的json包解析成jsonObject,   

  

然后封装成JsonContext , JsonContext 是DocumentContext的一个实现.  parse函数返回 DocumentContext.

 

 2.   root.read('')  ,首先是解析路径字符串,用'.' 分割成PathToken (PathToken 是链表, 用next 指向下一节点) 

  PathToken 下的子类来实现各种的路径(RootPathToken 代表jsonpath 根类)

 

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

PathCompiler: 字符串解析类

readNextToken()  读取下一个

  PERIOD 就是 '.' , 分割字符串.

 

解析完 在CompiledPath 类 root变量存储 PathToken 

JsonPath.read():

  CompiledPath:

 

 evaluate 来计算json 路径的值

EvaluationContextImpl 中  root 就是PathToken, rootDocument 是上面分析的jsonObject.

 如果是叶子结点,就添加到model 到 EvaluationContextImpl 中(model 就是最后取的值),如果不是,就next 取下一个PathToken, 解析.

 

推荐阅读