如果要检查一个JSONObject
是否包含特定的键,可以用.has(String key)
方法来判断。但这个方法只能用来判断键,而不能直接用于判断值。对于判断JSONObject
的值中是否包含特定的字符串,需要遍历JSONObject
的所有值并逐一检查。
import org.json.JSONObject;
import java.util.Iterator;
public class JsonUtil {
public static boolean containsValue(JSONObject jsonObject, String searchString) {
Iterator<String> keys = jsonObject.keys();
while (keys.hasNext()) {
String key = keys.next();
Object value = jsonObject.get(key);
// 如果值是字符串,检查是否包含搜索字符串
if (value instanceof String && ((String) value).contains(searchString)) {
return true;
}
// 如果值是JSONObject或JSONArray,可以递归地调用此方法
if (value instanceof JSONObject) {
if (containsValue((JSONObject) value, searchString)) {
return true;
}
}
}
return false;
}
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject("{ \"name\": \"John\", \"city\": \"New York\", \"hobbies\": {\"first\": \"Football\", \"second\": \"Singing\"} }");
String searchFor = "New York";
boolean containsString = containsValue(jsonObject, searchFor);
System.out.println("JSONObject contains \"" + searchFor + "\": " + containsString);
}
}
这个containsValue
方法将迭代JSONObject
的所有键,并检查对应的值是否为String
并含有指定的搜索字符串。这里的方法没有处理JSON数组和嵌套的JSON对象的情况,如有需要可以增加对org.json.JSONArray
的检查,并递归地调用containsValue
来进行深度搜索。这个例子方法会在找到第一个匹配时停止搜索,返回true
。如果没有找到,最终会返回false
。
要将之前的代码调整成可以处理多个JSON对象,并且只返回包含特定字符串(“example”)的完整的JSON对象,需要调整搜索机制。这次不是收集匹配的键值对,而是只有当整个JSON对象中至少有一个字符串值包含"example",才保留那个完整的JSON对象。
在代码中加入了多个静态转为String的对象,实际使用可替换为接口返回的对象。
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Iterator;
public class JsonUtil {
public static JSONArray findAllObjectsWithMatchingValue(JSONArray jsonArray, String searchString) {
JSONArray matchedObjects = new JSONArray(); // 用于存储匹配的 JSON 对象
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (containsValue(jsonObject, searchString)) {
// 如果 JSON 对象中至少有一个字符串值包含指定字符串,则添加到结果数组中
matchedObjects.put(jsonObject);
}
}
return matchedObjects;
}
private static boolean containsValue(JSONObject jsonObject, String searchString) {
Iterator<String> keys = jsonObject.keys();
while (keys.hasNext()) {
String key = keys.next();
Object value = jsonObject.get(key);
// 如果是字符串值,检查是否包含 searchString
if (value instanceof String && ((String) value).contains(searchString)) {
return true;
}
// 如果是 JSONObject,则递归检查
else if (value instanceof JSONObject) {
if(containsValue((JSONObject) value, searchString)) {
return true;
}
}
// 如果是 JSONArray,则遍历每个元素
else if (value instanceof JSONArray) {
JSONArray array = (JSONArray) value;
for (int i = 0; i < array.length(); i++) {
Object element = array.get(i);
// 如果元素是 JSONObject,递归检查
if (element instanceof JSONObject) {
if (containsValue((JSONObject) element, searchString)) {
return true;
}
}
}
}
}
return false;
}
public static void main(String[] args) {
// 测试 JSON 数据数组
String json1 = "{"
+ " \"name\": \"tom\","
+ " \"city\": \"New York\","
+ " \"hobbies\": {\"first\": \"Football\", \"second\": \"Singing\"},"
+ " \"contact\": ["
+ " { \"type\": \"phone\", \"value\": \"123456789\" },"
+ " { \"type\": \"email\", \"value\": \"john.doe@QQ.com\" }"
+ " ]"
+ "}";
String json2 = "{"
+ " \"name\": \"JEYY\","
+ " \"city\": \"New York\","
+ " \"hobbies\": {\"first\": \"Football\", \"second\": \"Singing\"},"
+ " \"contact\": ["
+ " { \"type\": \"phone\", \"value\": \"12345\" },"
+ " { \"type\": \"email\", \"value\": \"john.doe@example.com\" }"
+ " ]"
+ "}";
String json3 = "{"
+ " \"name\": \"DIFF\","
+ " \"city\": \"New York\","
+ " \"hobbies\": {\"first\": \"Football\", \"second\": \"Singing\"},"
+ " \"contact\": ["
+ " { \"type\": \"phone\", \"value\": \"123456789\" },"
+ " { \"type\": \"email\", \"value\": \"john.doe@163.com\" }"
+ " ]"
+ "}";
JSONArray jsonArray = new JSONArray();
jsonArray.put(new JSONObject(json1));
jsonArray.put(new JSONObject(json2));
jsonArray.put(new JSONObject(json3));
String searchFor = "example";
// 查找 JSON 数据中包含指定字符串的所有完整 JSON 对象
JSONArray matchedObjects = findAllObjectsWithMatchingValue(jsonArray, searchFor);
// 打印结果
System.out.println("All JSON objects containing \"" + searchFor + "\": " + matchedObjects.toString(4));
}
}
返回的数据为:
All JSON objects containing "example": [
{
"name": "JEYY",
"city": "New York",
"hobbies": {
"first": "Football",
"second": "Singing"
},
"contact": [
{
"type": "phone",
"value": "12345"
},
{
"type": "email",
"value": "john.doe@example.com"
}
]
}
]
因为通过遍历只有该String有“example” 关键字。