java中JSON字符串处理的踩坑

在处理JSON字符串的时候,读取的数据原封不动每一行是,前后有两个引号

"{\"cuidC54E92418CA1CD099A5AFC4D2F322015|VECB5VMT4\": {\"REFINED_APPLIST_TIMESTAMP\": 1756716480, \"DEVICE_INFO\": {\"SOURCE\": 131072, \"brand\": \"华为荣耀\", \"model\": \"200\", \"last_ts\": 1757347200}, \"APPLIST\": {\"手机淘宝\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.taobao.taobao\"]}, \"UC浏览器\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.UCMobile\"]}, \"百度地图\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.baidu.BaiduMap\"]}, \"京东\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.jingdong.app.mall\"]}, \"喜马拉雅\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.ximalaya.ting.android\"]}, \"番茄畅听\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.xs.fm\"]}, \"哔哩哔哩\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"tv.danmaku.bili\"]}, \"小红书\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.xingin.xhs\"]}, \"抖音极速版\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.ss.android.ugc.aweme.lite\"]}, \"唯品会\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.achievo.vipshop\"]}, \"腾讯视频\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.tencent.qqlive\"]}, \"淘宝直播\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.taobao.live\"]}, \"爱奇艺\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.qiyi.video\"]}, \"快手\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.smile.gifmaker\"]}, \"美团\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.sankuai.meituan\"]}, \"番茄免费小说\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.dragon.read\"]}, \"百度\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.baidu.searchbox\"]}, \"抖音短视频\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.ss.android.ugc.aweme\"]}, \"支付宝\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.eg.android.AlipayGphone\"]}, \"今日头条\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.ss.android.article.news\"]}, \"携程旅行\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"ctrip.android.view\"]}, \"头条搜索极速版\": {\"FIRST_IN\": 1724342400, \"SOURCE\": 4194304, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.ss.android.article.lite\"]}, \"酷狗音乐\": {\"FIRST_IN\": 1753718400, \"SOURCE\": 4194304, \"INSTALL_ACTION\": 1753718400, \"LAST_IN\": 1756742400, \"PACKAGE_NAME\": [\"com.kugou.android\"]}}, \"MAPPING_SCORE\": 100, \"LAST_ACTIVE_DAY\": \"7\", \"UNINSTALL_APPLIST\": {\"中国银行\": {\"FIRST_IN\": 1741017600, \"SOURCE\": 4194304, \"INSTALL_ACTION\": 1741017600, \"LAST_IN\": 1753718400, \"PACKAGE_NAME\": [\"com.chinamworld.bocmbci\"]}, \"微信\": {\"FIRST_IN\": 1741017600, \"SOURCE\": 4194304, \"INSTALL_ACTION\": 1741017600, \"LAST_IN\": 1753718400, \"PACKAGE_NAME\": [\"com.tencent.mm\"]}, \"中国移动\": {\"FIRST_IN\": 1741017600, \"SOURCE\": 4194304, \"INSTALL_ACTION\": 1741017600, \"LAST_IN\": 1753718400, \"PACKAGE_NAME\": [\"com.greenpoint.android.mc10086.activity\"]}}}}"

image

 

将这个字符串放在 https://www.sojson.com/ 是可以正常解析的,但是在代码中怎么都解析不了。

实际上将这一行内容读取到代码中会添加很多转义字符

image

 

需要将字符串进行清洗

// 解析JSON为根对象(设备ID的Map)
        String trimmedLine = line;
        if (trimmedLine.startsWith("\"") && trimmedLine.endsWith("\"")) {
            trimmedLine = trimmedLine.substring(1, trimmedLine.length() - 1);
        }

        String cleanedJson = trimmedLine.replaceAll("\\\\\"", "\"");

        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 将 JSON 字符串解析为 JsonNode
            JsonNode rootNode = objectMapper.readTree(cleanedJson);

            // 遍历每一个设备 ID
            Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
            while (fields.hasNext()) {
                Map.Entry<String, JsonNode> entry = fields.next();
                String deviceId = entry.getKey();
                JsonNode deviceNode = entry.getValue();

                System.out.println("设备 ID: " + deviceId);

                // 获取应用列表
                JsonNode appListNode = deviceNode.get("APPLIST");
                if (appListNode != null) {
                    Iterator<Map.Entry<String, JsonNode>> appFields = appListNode.fields();
                    while (appFields.hasNext()) {
                        Map.Entry<String, JsonNode> appEntry = appFields.next();
                        String appName = appEntry.getKey();
                        JsonNode appInfo = appEntry.getValue();
                        // 检查TYPE字段是否存在且不为null
                        if (appInfo.has("TYPE") && !appInfo.get("TYPE").isNull()) {
                            int typeValue = appInfo.get("TYPE").asInt();
                            System.out.println("  应用名称: " + appName + ", TYPE: " + typeValue);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

  

posted @ 2025-09-12 11:50  my日常work  阅读(8)  评论(0)    收藏  举报