栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数据处理手法教学,透彻解析JSON文件!

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据处理手法教学,透彻解析JSON文件!

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 对象来调用属性的方式,觉得也是一种不错的方法,毕竟还是对象用起来比较舒服。

有其他更快、更好的想法或工具的也可以提出来,互相学习,共同进步!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323705.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号