JSONQuery
Helps querying JSONNode objects with varieties of expressions
Install / Use
/learn @kcthota/JSONQueryREADME
JSONQuery
[![Apache 2.0] (https://img.shields.io/github/license/kcthota/JSONQuery.svg)] (http://www.apache.org/licenses/LICENSE-2.0)
[![Java Doc] (https://img.shields.io/badge/javadoc-0.0.5-brightgreen.svg)] (http://www.javadoc.io/doc/com.kcthota/JSONQuery)
Query JsonNode objects with intuitive expressions.
##Usage Stable Release:
<dependency>
<groupId>com.kcthota</groupId>
<artifactId>JSONQuery</artifactId>
<version>0.0.5</version>
</dependency>
Latest Snapshot Release:
<dependency>
<groupId>com.kcthota</groupId>
<artifactId>JSONQuery</artifactId>
<version>0.0.6-SNAPSHOT</version>
</dependency>
##Example: Consider the following JSON object.
{
"name":{
"first":"John",
"last":"Doe"
},
"age":31,
"interests":["hiking","biking"]
"state":"CA"
}
###is Checks if the passed in expression is true for the object.
Equals
Query.q(node).is(eq("state", "CA")); //returns true
Query.q(node).is(eq("name/first", "Jane")); //returns false
Query.q(node).is(eq("name/last", "Doe")); //returns true
Query.q(node).is(eq("interests/0", "hiking")); //returns true
Query.q(node).is(eq(appendTo("state", ", USA"), "CA, USA")); //returns true
Not Equals
Query.q(node).is(ne("state", "CA")); //returns false
Query.q(node).is(ne("name/first", "Jane")); //returns true
Query.q(node).is(ne("age", 35)); //returns true
Query.q(node).is(ne(prependTo("state", "1"), "CA")); //returns true
Greater than
Query.q(node).is(gt("age", 31)); //returns false
Less than
Query.q(node).is(lt("age", 32)); //returns true
Greater than or Equal to
Query.q(node).is(ge("age", 31)); //returns true
Less than or Equal to
Query.q(node).is(le("age", 32)); //returns true
Null
Query.q(node).is(Null("state")); //returns false
Not
Query.q(node).is(not(eq("state", "CA"))); //returns false
Query.q(node).is(not(eq("name/first", "Jane"))); //returns true
Query.q(node).is(not(eq("name/last", "Doe"))); //returns false
Query.q(node).is(not(Null("state"))); //returns true
AND
Query.q(node).is(and(eq("name/first", "John"), eq("age",31))); //returns true
Query.q(node).is(and(eq("name/first", "John"), ne("age",31))); //returns false
OR
Query.q(node).is(or(eq("name/first", "John"), eq("age",31))); //returns true
Query.q(node).is(or(eq("name/first", "John"), ne("age",31))); //returns true
Multiple AND/OR
Query.q(node).is(or(and(eq("name/first", "John"), eq("age",31)), eq("state", "FL"))); //returns true
Query.q(node).is(and(and(eq("name/first", "John"), eq("age",31)), eq("state", "FL"))); //returns false
Substring Of
Query.q(node).is(substringof("name/first", "Jo")); //returns true
Query.q(node).is(substringof("age", "Jo")); //returns false, age value is not string
Starts With
Query.q(node).is(startsWith("name/first", "Jo")); //returns true
Query.q(node).is(startsWith("age", "Jo")); //returns false, age value is not string
Ends With
Query.q(node).is(endsWith("name/first", "Jo")); //returns false
Query.q(node).is(endsWith("age", "Jo")); //returns false, age value is not string
###isExist Checks if property exist for the JsonNode.
Query.q(node).isExist("age"); //returns true
Query.q(node).isExist("name1"); //returns false
Query.q(node).isExist("name/middle"); //returns false
###value Retrieves the value of a property in the JsonNode
as is
Query.q(node).value("name/first").textValue(); //returns John
Query.q(node).value("name"); //returns the JsonNode object for name.
Query.q(node).value("city"); //throws MissingNodeException
Query.q(node).value("interests/0").textValue(); //returns hiking
Append to
Query.q(node).value(appendTo("name/first", "K")).textValue(); //returns JohnK
Query.q(node).value(appendTo("interests/0", " hills")).textValue(); //returns hiking hills
Query.q(node).value(appendTo("age", "K")); //throws UnsupportedExprException, when appending to non-string values
Prepend to
Query.q(node).value(prependTo("name/first", "K")).textValue(); //returns KJohn
Query.q(node).value(prependTo("interests/0", "hill ")).textValue(); //returns hill hiking
Query.q(node).value(prependTo("age", "K")); //throws UnsupportedExprException, when appending to non-string values
Trim
Query.q(node).value(trim("name/first")).textValue(); //returns John
Query.q(node).value(trim("interests/0")).textValue(); //returns hiking
Query.q(node).value(trim("age")); //throws UnsupportedExprException, when appending to non-string values
To Upper case
Query.q(node).value(upper("name/first")).textValue(); //returns JOHN
Query.q(node).value(upper("interests/0")).textValue(); //returns HIKING
Query.q(node).value(upper("age")); //throws UnsupportedExprException, when appending to non-string values
To Lower case
Query.q(node).value(lower("name/first")).textValue(); //returns john
Query.q(node).value(lower("interests/0")).textValue(); //returns hiking
Query.q(node).value(lower("age")); //throws UnsupportedExprException, when appending to non-string values
Replace
Query.q(node).value(replace("name/first", "John", "Jane")).textValue(); //returns Jane
Query.q(node).value(replace("interests/0", "hik", "bik")).textValue(); //returns biking
Query.q(node).value(replace("interests/0", "zzz", "")).textValue(); //unchanged without match, returns hiking
Query.q(node).value(lower("age")); //throws UnsupportedExprException, when appending to non-string values
Substring
Query.q(node).value(substring("name/first", 1)).textValue(); //returns ohn
Query.q(node).value(substring("interests/0", 0, 2)).textValue(); //returns hi
Query.q(node).value(substring("interests/0", 2, 100)).textValue(); //caps to max length and returns king
Query.q(node).value(lower("age")); //throws UnsupportedExprException, when appending to non-string values
length
Query.q(node).value(length("name/firstName")); //returns 4; len(John)
Query.q(node).value(length(null)); //returns 4, number of fields in object node
Query.q(node).value(length("interests")); //returns 2, number of elements in array
Query.q(node).value(length("age")); //returns 0, if property value is not an array, object or string
indexof
Query.q(node).value(indexof("name/firstName", "J")); //returns 0
Query.q(node).value(indexof("name/firstName", null)); //returns -1, indexof str is null
Query.q(node).value(indexof("interests/0", "iking")); //returns 1
Query.q(node).value(indexof("interests", "hiking")); //returns -1, interests is an array, not a string
Query.q(node).value(indexof("age", "24")); //returns -1, property value is not string
Value Expression Combinations
Query.q(node).value(val(val("name"),"first")).textValue(); //returns John
Query.q(node).value(appendTo(prependTo("name/first", "K"),"C")).textValue(); //returns KJohnC
Query.q(node).value(appendTo(prependTo("interests/0", "hill ")," in CA")).textValue(); //returns hill hiking in CA
Filter
Allows filtering objects in an ArrayNode as per passed in expression
Query.q(node).filter("interests", eq((String)null, "hiking"); //returns a new ArrayNode, ["hiking"]
Query.q(node).filter("interests", ne((String)null, "hiking"); //returns ["biking"]
Query.q(node).filter("interests", or(eq((String)null, "biking"), eq((String)null, "hiking"))); //returns ["hiking", "biking"]
Query.q(ArrayNode).filter(not(Null("address")); //returns array of objects with address property not null
Query.q(node).filter("interests", or(eq((String)null, "biking"), eq((String)null, "hiking"))).value("0").textValue(); //returns hiking
##Filter Pagination
Query.q(node).skip(1).filter("interests", eq((String)null, "hiking"); //skips the first result
Query.q(node).top(1).filter("interests", eq((String)null, "hiking"); //retuns the first result
Query.q(node).skip(2).top(1).filter("interests", eq((String)null, "hiking"); //returns the first result, skipping 2 objects from top
Refer [unit tests] (https://github.com/kcthota/JSONQuery/tree/master/src/test/java/com/kcthota/query) for more examples.
<!-- ###Only in SNAPSHOT release Following features are newly added and available in latest snapshot release -->License:
Copyright 2015 Krishna Chaitanya Thota (kcthota@gmail.com)
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Related Skills
node-connect
344.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
99.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。

