JSONobject如何判断是否包含指定字符串

如果要检查一个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” 关键字。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值