需求
给一个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进去的数据与输出的数据顺序不一致问题
详情见 ---> 这里
本周工作不太顺利...(悲), 周末再学习下,任重而道远......