#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化版JSON文件读取工具
快速读取和遍历JSON数据
"""

import os
import sys
import json

def read_json_simple(file_path):
    """简单读取JSON文件"""
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data
    except Exception as e:
        print(f"读取JSON文件失败: {e}")
        return None

def print_json_data(data, indent=0, max_depth=5):
    """打印JSON数据"""
    if indent > max_depth:
        print("  " * indent + "... (达到最大深度)")
        return
    
    if isinstance(data, dict):
        for key, value in data.items():
            if isinstance(value, (dict, list)):
                print("  " * indent + f"{key}: ({type(value).__name__})")
                print_json_data(value, indent + 1, max_depth)
            else:
                value_str = str(value)
                if len(value_str) > 100:
                    value_str = value_str[:100] + "..."
                print("  " * indent + f"{key}: {value_str}")
    
    elif isinstance(data, list):
        for i, item in enumerate(data):
            if isinstance(item, (dict, list)):
                print("  " * indent + f"[{i}]: ({type(item).__name__})")
                print_json_data(item, indent + 1, max_depth)
            else:
                value_str = str(item)
                if len(value_str) > 100:
                    value_str = value_str[:100] + "..."
                print("  " * indent + f"[{i}]: {value_str}")
    
    else:
        value_str = str(data)
        if len(value_str) > 100:
            value_str = value_str[:100] + "..."
        print("  " * indent + value_str)

def count_json_items(data):
    """统计JSON数据项数量"""
    if isinstance(data, dict):
        return len(data)
    elif isinstance(data, list):
        return len(data)
    else:
        return 1

def get_json_keys(data):
    """获取JSON中的所有键"""
    keys = set()
    
    if isinstance(data, dict):
        for key, value in data.items():
            keys.add(key)
            if isinstance(value, (dict, list)):
                keys.update(get_json_keys(value))
    
    elif isinstance(data, list):
        for item in data:
            if isinstance(item, (dict, list)):
                keys.update(get_json_keys(item))
    
    return list(keys)

def find_values_by_key(data, target_key):
    """根据键名查找所有值"""
    results = []
    
    if isinstance(data, dict):
        for key, value in data.items():
            if key == target_key:
                results.append(value)
            if isinstance(value, (dict, list)):
                results.extend(find_values_by_key(value, target_key))
    
    elif isinstance(data, list):
        for item in data:
            if isinstance(item, (dict, list)):
                results.extend(find_values_by_key(item, target_key))
    
    return results

def main():
    """主函数"""
    print("简化版JSON读取工具")
    print("=" * 30)
    
    # 查找JSON文件
    json_files = [f for f in os.listdir('.') if f.lower().endswith('.json')]
    
    if not json_files:
        print("当前目录下没有找到JSON文件")
        return
    
    # 使用第一个JSON文件
    json_file = json_files[0]
    print(f"找到JSON文件: {json_file}")
    
    # 读取JSON文件
    data = read_json_simple(json_file)
    
    if data is None:
        print("读取失败")
        return
    
    print("✓ 文件读取成功")
    
    # 显示基本信息
    print(f"\n数据类型: {type(data).__name__}")
    
    if isinstance(data, dict):
        print(f"字典键数量: {len(data)}")
        print(f"键列表: {list(data.keys())}")
    elif isinstance(data, list):
        print(f"列表元素数量: {len(data)}")
        if data:
            print(f"第一个元素类型: {type(data[0]).__name__}")
    
    # 显示所有键
    all_keys = get_json_keys(data)
    if all_keys:
        print(f"\n所有键 ({len(all_keys)} 个):")
        for key in sorted(all_keys):
            print(f"  - {key}")
    
    # 遍历并显示数据
    print(f"\n数据内容:")
    print("-" * 30)
    print_json_data(data)
    
    # 搜索功能
    print(f"\n" + "=" * 30)
    search_key = input("请输入要搜索的键名 (回车跳过): ").strip()
    
    if search_key:
        values = find_values_by_key(data, search_key)
        if values:
            print(f"\n找到键 '{search_key}' 的 {len(values)} 个值:")
            for i, value in enumerate(values[:10]):  # 只显示前10个
                print(f"  {i+1}. {value}")
            if len(values) > 10:
                print(f"  ... 还有 {len(values) - 10} 个值")
        else:
            print(f"没有找到键 '{search_key}'")
    
    print(f"\n处理完成!")

if __name__ == "__main__":
    main()

更多推荐