美文网首页最简单轻量的PHP CURL工具库
重造轮子の java-json & 简易查询表达式

重造轮子の java-json & 简易查询表达式

作者: 许一沐 | 来源:发表于2016-09-23 23:36 被阅读252次

    日前在写ws-http.java过程中,有需要用到json库,最好用的莫过于gson,然而又有些依赖,忍痛放弃,又看了下其它的库实现,遂有了自己动手实现一个json库的意图,起始也实现了一个,始终是不太完善,尤其是POJO的处理上.又感觉json反转到POJO类的意义不大,在接口自动化测试的过程中尤甚.

    尝试在github中仔细检索无依赖的工具库,发现了ralfstx实现的minimal-json,非常的喜欢,索性顺了过来,又按着自己的想法对其进行了削减. 最终提供便捷的三个方法来处理 json

    JsonValue JSON.parseJSON(String json) 
    JsonValue JSON.parseJSONFile(String path, boolean isUrl) 
    String JSON.toJSON(Object obj) 
    

    昨天晚上写了几个测试demo发觉提取复合json对象的值还是比较麻烦,比如 要从以下json串提取 request_id 的值,需要这么写

    String json = "{\"account_id\":\"11\",\"channel\":\"dxr\",\"domain\":\"113.131.145.124\",\"port\":\"80\",\"request_id\":\"3108d78a2220\",\"request_time\":\"1473833813956\",\"timestamp\":1474251393}";
    JsonValue jsonobj =  JSON.parseJSON(json);
    System.out.println(jsonobj.asObject().get("request_id").asString());  
    

    如果还有更深的层次那代码就更多,所以就想能不能使用一种快速查询的方法来提取,因为之前使用过json-path,功能是很强大,看了几个知名的实现,发现都比较复杂,类文件就不下 20个的,还有其它依赖.

    仔细想想其实我用不到这么复杂的查询语法,我只是想从前一个接口返回来的数据中做一些简单的提取,那我实现一直简单的语法是否可以,比如:

    "key1.key2.key3" == 435 意味着从 json串 {key1:{key2:{key3: 435}}} 中级联提取 属性值
    "key1.1.key2" == 456 则表示 json串 {key1:[{key2:123},{key2:456}]} 中 key1数组的第二个元素中的 key2属性的值
    ...
    

    关于这些key的表达无非就是字符串而已,是不是就解析字符串就可行了呢?

    遇到一个实际问题,如果用户的json串对象里存在数字key该怎么办?关于这个的想法,目前是使用符号"``"来进行标识.

    白天构思了下具体实现,终于在1个小时之前实施完成,简单的一个类,使用几个简单的正则表达式来分解字符串,从而完成了一个快速索引表达式方法,如下所示:

    JsonValue JSON.query(JsonValue json, String queryMl)
    

    简单的测试代码如下:

    JsonValue jsonobj = JSON.parseJSONFile("C:/tmptt/postmanv1.json", false);
    System.out.println(jsonobj.toString());
    System.out.println(JSON.query(jsonobj, "id").asString());
    System.out.println(JSON.query(jsonobj, "description").asString());
    System.out.println(JSON.query(jsonobj, "folders.1.name"));
    System.out.println(JSON.query(jsonobj, "requests.0.responses.0.headers.2.key").asString());
    

    输出结果如下所示:

    f695cab7-6878-eb55-7943-ad88e1ccfd65
    Postman Echo is service you can use to test your REST clients and make sample API calls. It provides endpoints for `GET`, `POST`, `PUT`, various auth mechanisms and other utility endpoints.
    
    The documentation for the endpoints as well as example responses can be found at [[https://echo.getpostman.com](https://echo.getpostman.com/)]([https://echo.getpostman.com](https://echo.getpostman.com/)?source=echo-collection-app-onboarding)
    "Auth: Others"
    Access-Control-Allow-Methods
    

    相关文章

      网友评论

        本文标题:重造轮子の java-json & 简易查询表达式

        本文链接:https://www.haomeiwen.com/subject/rzqxyttx.html