ホイールを再構築するjava-json&簡易クエリー式

2864 ワード

先日ws-httpを書いています.JAvaの過程で、jsonライブラリを使う必要があり、最も良いのはgsonであるが、少し依存し、痛みを我慢して放棄し、他のライブラリの実現を見て、自分でjsonライブラリを実現する意図があり、最初も1つを実現し、終始あまり完備していない、特にPOJOの処理上である.また、jsonがPOJO類に反転する意義は大きくないと感じ、インタフェースの自動化テストの過程で特に顕著である.
githubで依存のないツールライブラリをよく検索してみると、ralfstxで実現されたminimal-jsonが、とても好きで、いっそのこと順になって、また自分の考えで削減していることがわかりました.最終的に便利な3つの方法を提供して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