Java下JsonPath和JSONObjec处理Json实例

需求

给一个Json文件,筛选出特定字段属性,替换为要求格式并格式化输出新文件

要求被处理的Json文件数据(部分)

{
    "code": 200,
    "shopTuan": [
        {
            "id": 714280407,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2021-07-29T08:14:28.000Z",
            "picUrl": "https://p0.meituan.net/dpmerchantpic/23c7279e5351f1d8a27f8ff9abb09935391658.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "159",
            "marketPrice": "209",
            "title": "【特惠指压】养气推拿",
            "saleCount": 1174,
            "iconUrl": "https://www.dpfile.com/sc/mobile/mapi-dp-web/search_list_tuan.png",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=714280407&cityId=1010&shopUuid=H2WTGQ10qifYdc54",
            "reduc": {
                "text": "减12"
            },
            "promo": {
                "text": "APP立减",
                "openAppUrl": "dianping://tuandeal?id=714280407"
            }
        },
        {
            "id": 653430415,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2020-08-07T03:02:21.000Z",
            "picUrl": "https://p1.meituan.net/dpmerchantpic/b742b1d388c042b7bbe007e8139fdfe5391824.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "209",
            "marketPrice": "259",
            "title": "【本店爆款】禅【足浴 推拿】,免费WiFi,男女通用",
            "saleCount": 856,
            "iconUrl": "",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=653430415&cityId=1010&shopUuid=H2WTGQ10qifYdc54",
            "reduc": {
                "text": "减16"
            },
            "promo": {
                "text": "APP立减",
                "openAppUrl": "dianping://tuandeal?id=653430415"
            }
        },
        {
            "id": 714281815,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2021-07-29T08:57:43.000Z",
            "picUrl": "https://p1.meituan.net/dpmerchantpic/3585175846b3b3fd2b86e9ccf175157e1294445.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "149",
            "marketPrice": "189",
            "title": "【特惠】养元足浴",
            "saleCount": 707,
            "iconUrl": "",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=714281815&cityId=1010&shopUuid=H2WTGQ10qifYdc54"
        },
        {
            "id": 31202253,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2018-05-09T04:53:55.000Z",
            "picUrl": "https://p1.meituan.net/dpmerchantpic/e06cac2efda57ed25b55a2151c55edd534026.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "309",
            "marketPrice": "389",
            "title": "【网红爆款】尚·SPA【经络油压】,免费WiFi",
            "saleCount": 342,
            "iconUrl": "",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=31202253&cityId=1010&shopUuid=H2WTGQ10qifYdc54",
            "reduc": {
                "text": "减20"
            },
            "promo": {
                "text": "APP立减",
                "openAppUrl": "dianping://tuandeal?id=31202253"
            }
        },
        {
            "id": 31202086,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2018-05-09T04:43:58.000Z",
            "picUrl": "https://p0.meituan.net/dpmerchantpic/37a0a5c45652d73385ab9d307f15431128090.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "269",
            "marketPrice": "309",
            "title": "【限量爆款】树【推油开背+足浴】,免费WiFi,免费停车位",
            "saleCount": 285,
            "iconUrl": "",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=31202086&cityId=1010&shopUuid=H2WTGQ10qifYdc54"
        },
        {
            "id": 713208220,
            "shortTitle": "罗马公馆健康足浴推拿",
            "beginDate": "2021-07-24T02:25:10.000Z",
            "picUrl": "https://p1.meituan.net/dpmerchantpic/1cee91d3c05cf5c67ce1ff7acfef6cd2248647.jpg%40100w_100h_1e_1c_1l%7Cwatermark%3D1%26%26r%3D1%26p%3D9%26x%3D2%26y%3D2%26relative%3D1%26o%3D20",
            "price": "169",
            "marketPrice": "189",
            "title": "中式推拿",
            "saleCount": 12,
            "iconUrl": "",
            "dealType": 1,
            "url": "/packages/tuan/pages/tuandetail/tuandetail?dealGroupId=713208220&cityId=1010&shopUuid=H2WTGQ10qifYdc54"
        }
    ],
    "mediumDate": null,
    "popData": null,
    "shopUuid": "H2WTGQ10qifYdc54",
    "loginCode": 100
}

需要的格式(不是上文的对应,只是一个例子)

{
  "tuan_list": [
    {
      "tuanName": "【特惠指压】养气推拿",
      "soldNum": "1142",
      "price": "159",
      "o_price": "209"
    },
    {
      "tuanName": "【本店爆款】禅【足浴 推拿】,免费WiFi,男女通用",
      "soldNum": "814",
      "price": "209",
      "o_price": "259"
    },
    {
      "tuanName": "【特惠】养元足浴",
      "soldNum": "699",
      "price": "149",
      "o_price": "189"
    },
    {
      "tuanName": "【网红爆款】尚·SPA【经络油压】,免费WiFi",
      "soldNum": "319",
      "price": "309",
      "o_price": "389"
    },
    {
      "tuanName": "【限量爆款】树【推油开背+足浴】,免费WiFi,免费停车位",
      "soldNum": "276",
      "price": "269",
      "o_price": "309"
    },
    {
      "tuanName": "中式推拿",
      "soldNum": "11",
      "price": "169",
      "o_price": "189"
    }
  ],
  "shopID": "H2WTGQ10qifYdc54"
}

不多说,直接上代码 


package DataSolve;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jayway.jsonpath.JsonPath;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.LinkedHashMap;
import java.util.List;

public class NewDate {
    public static void main(String[] args) throws Exception {
        String filePath = "/Users/zhaokeyi/Desktop/photo_res";
        // 将Json文件每行读取存入lists
        List<String> lines = FileUtils.readLines(new File(filePath), "UTF-8");
        int cnt = 0;
        for (String line : lines) {
            JSONObject obj = JSONObject.parseObject(line);
            // 有shopTuan再进行筛选
            if (obj.containsKey("shopTuan")) {
                Object test = JsonPath.read(line, "$.shopTuan");
                if (test != null) {

                    // 获取长度shopTuan数组长度
                    Object len = JsonPath.read(line, "$.shopTuan.length()");
                    int length = Integer.parseInt(String.valueOf(len));


                    if (length > 0) {
                        String tuanName, price, o_price;
                        String shopID = JsonPath.read(line, "$.shopUuid");
                        // 由于soldNum 有int 和 String两种,先用Object统一
                        Object soldNum;

                        // ansObj为最终修改后的格式
                        JSONObject ansObj = new JSONObject();
                        JSONArray arr = new JSONArray();

                        // 遍历shopTuan数组
                        for (int i = 0; i < length; i++) {
                            String path = "$.shopTuan.[" + i + "].";
                            tuanName = JsonPath.read(line, (path + "title"));
                            soldNum = JsonPath.read(line, (path + "saleCount"));
                            price = JsonPath.read(line, (path + "price"));
                            o_price = JsonPath.read(line, (path + "marketPrice"));

                            // Obj临时存储所有Key Value
                            // 依次加入各个属性 和 值 切记LinkedHashMap
                            JSONObject Obj = new JSONObject(new LinkedHashMap<>());
                            Obj.put("tuanName", tuanName);
                            Obj.put("soldNum", soldNum);
                            Obj.put("price", price);
                            Obj.put("o_price", o_price);

                            // 把Obj添加到Json数组arr中
                            arr.add(Obj);
                        }

                        // 每一行Json转换格式到ansObj
                        ansObj.put("tuan_ist", arr);
                        ansObj.put("shopId", shopID);
                        System.out.println(ansObj);
                        // 文件输出
                        FileUtils.writeStringToFile(new File("/Users/zhaokeyi/Desktop/photo_res_u"), ansObj.toJSONString() + "\n", "UTF-8", true);
                    }
                }
            }
        }
    }
}

Tip: 注意JSONObject 初始化里面记得 new LinkedHashMap(), 不然会有put进去的数据与输出的数据顺序不一致问题

详情见 ---> 这里

本周工作不太顺利...(悲), 周末再学习下,任重而道远......


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值