如何高效查看大容量JSON文件结构、字段类型及长度,无需输出全量数据
大体积JSON股票数据结构快速查询解决方案
问题背景
处理包含数千至数万条目的JSON格式股票数据时,常规结构排查方法存在以下痛点:
- 使用
json.dumps(data, indent=4)打印时,部分key对应值条目过多,整体可读性差 - 转为pandas DataFrame后调用
info()方法结果被截断,无法展示完整结构 pprint打印会输出超长列表内容,GB级大文件完全不适用
问题1:快速获取JSON/dict/pandas对象结构轮廓的方法
针对JSON加载后的dict对象
可以手写极简递归函数实现类似np.array.shape的轮廓输出,示例代码如下:
def get_dict_shape(d, depth=0): if isinstance(d, dict): return {k: get_dict_shape(v, depth+1) for k, v in d.items()} elif isinstance(d, (list, tuple)): return f"<type={type(d).__name__}, len={len(d)}, element_type={type(d[0]).__name__ if d else 'empty'}>" else: return f"<type={type(d).__name__}, value_len={len(str(d)) if isinstance(d, (str, bytes)) else 'N/A'}>"
调用get_dict_shape(your_json_data)即可直接输出层级化的结构轮廓,不会打印全量数据。
针对pandas DataFrame对象
- 基础轮廓直接调用
df.shape即可返回(行数, 列数)的元组,和np.array.shape用法完全一致 - 如需查看全量列的类型信息,先解除pandas的显示限制再调用info:
import pandas as pd # 解除列、行显示限制 pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) df.info(verbose=True, show_counts=True)
问题2:仅输出key、数据类型、长度等元信息的实现方案
小体积JSON文件(内存可容纳)
直接用上面提供的get_dict_shape函数,输出格式和你要求的效果完全匹配,示例输出如下:
{ "Name": { "title": "<type=str, value_len=20>", "time_stamp": "<type=list, len=3000, element_type=int>", "closing_price": "<type=list, len=3000, element_type=float>" } }
GB级超大JSON文件(内存无法容纳)
使用ijson库做流式解析,不需要加载全量文件即可提取完整结构元信息,示例代码如下:
import ijson def get_large_json_schema(file_path): schema = {} with open(file_path, 'rb') as f: parser = ijson.parse(f) for prefix, event, value in parser: if event == 'start_map': schema[prefix] = {} elif event in ['string', 'number', 'boolean', 'null']: path = prefix.split('.') current = schema for p in path[:-1]: current = current[p] current[path[-1]] = f"<type={event}, len={len(str(value)) if event == 'string' else 'N/A'}>" elif event == 'start_array': path = prefix.split('.') current = schema for p in path[:-1]: current = current[p] arr_len = 0 elem_type = None for sub_prefix, sub_event, sub_value in parser: if sub_event == 'end_array': break arr_len +=1 if not elem_type: elem_type = sub_event current[path[-1]] = f"<type=list, len={arr_len}, element_type={elem_type}>" return schema
内容的提问来源于stack exchange,提问作者user16053699
相关产品推荐
相关产品推荐

