JSON解析手法JSON 文件的引用有很多,但最常见的一中用法是用作配置文件使用,通过配置外部JSON文件,来实现一定的配置化,增加代码的灵活性,开发中的常见手法!
- 1.Java手法
- 2.Scala手法
- 3.Python手法
- 4.后续想法
这里将介绍我的三种解析方式,分别时使用Java+fastjson、Scala+fastjson、Python+jsonpath,Let’s go !!!
需求: test.json文件为数据库的配置文件信息,通过传入数据库名和表明快速获取到对应信息!
test.json
{
"clean_info": [
{
"database": "db1",
"table_info": [
{
"table_name": "src_member",
"dwd_table": "db1.dwd_src_member",
"time_fields": "birthday",
"phone_fields": "mobile,phone",
"aes_fields": "name,email",
"md5_fields": "address"
},
{
"table_name": "orderinfo",
"dwd_table": "db1.dwd_orderinfo",
"time_fields": "create_time,/confirm/i_time",
"phone_fields": "mobile",
"aes_fields": "consignee,membercard,email",
"md5_fields": "address"
},
{
"table_name": "src_order",
"dwd_table": "db1.dwd_src_order",
"time_fields": "paytime",
"phone_fields": "mobile"
},
{
"table_name": "ordergood",
"dwd_table": "db1.dwd_ordergoods"
}
]
}
]
}
1.Java手法
比较繁琐,层层遍历解析,不是很nice!
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
public static JSONObject jsonParse(String db, String tableName) {
InputStream input = JsonParseJ.class.getResourceAsStream("/test.json");
JSONObject table = null;
try {
String cleanStr = IOUtils.toString(input, "utf-8");
JSONObject cleanObj = JSONObject.parseObject(cleanStr);
JSONArray tablesArr = cleanObj.getJSONArray("clean_info");
for (Object o : tablesArr) {
String db_info = o.toString();
JSONObject table_info = JSONObject.parseObject(db_info);
if (db.equals(table_info.getString("database"))) {
JSONArray tableArr = table_info.getJSONArray("table_info");
for (Object o1 : tableArr) {
JSONObject tableM = JSONObject.parseObject(o1.toString());
if (tableName.equals(tableM.getString("table_name"))) {
table = tableM;
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return table;
}
2.Scala手法
相较于Java,简单很多,使用filter()方法来节省Java的遍历判断操作!
import com.alibaba.fastjson.JSON
import org.apache.commons.io.IOUtils
import com.alibaba.fastjson.JSonObject
def loadDatabaseInfo(database: String): String = {
val inputStream = TableInformationLoad.getClass.getResourceAsStream("/test.json")
val content = IOUtils.toString(inputStream, "UTF-8")
JSON.parseArray(JSON.parseObject(content).getString("clean_info")).toArray().toList.map(r => r.toString)
.filter(j => JSON.parseObject(j).getString("database").equals(database)).head
}
def getTableInfo(database: String, table: String): JSonObject = JSON.parseObject(JSON.parseArray(JSON.parseObject(loadDatabaseInfo(database)).getString("table_info"))
.toArray().toList.map(r => r.toString).filter(j => JSON.parseObject(j).getString("table_name").equals(table)).head)
val dwd_table:String = getTableInfo("db1", "src_member").getString("dwd_table")
3.Python手法
个人主推,快的一批!
import json
from jsonpath import jsonpath
def json_parse2(db,table):
with open("/test.json",encoding='utf-8') as f:
clean_json=json.loads(f.read())
db_info= jsonpath(clean_json,f'$..clean_info[?(@.database == "{db}")]')
return jsonpath(db_info,f'$..table_info[?(@.table_name == "{table}")]')
src_member=json_parse2("db1","src_member")
print(jsonpath(src_member,'$..dwd_table'))
4.后续想法
由于Java用的人也比较多,如果可以解析json文件,自动生成对应的类,然后new 对象来调用属性的方式,觉得也是一种不错的方法,毕竟还是对象用起来比较舒服。
有其他更快、更好的想法或工具的也可以提出来,互相学习,共同进步!



