如何根据嵌套对象的commander值过滤大型JSON文件?
筛选JSON中
leadershipSkills.commander: true的键值对 方法一:Python实现
如果JSON文件体积适中,可直接加载到内存处理:
import json # 读取目标JSON文件 with open('your_cards.json', 'r', encoding='utf-8') as f: cards = json.load(f) # 筛选符合条件的卡片 filtered_cards = { card_name: card_data for card_name, card_data in cards.items() if card_data.get('leadershipSkills', {}).get('commander') is True } # 将筛选结果写入新文件 with open('filtered_commander_cards.json', 'w', encoding='utf-8') as f: json.dump(filtered_cards, f, indent=2)
若文件为GB级超大体积,建议用流式解析避免内存溢出:
import json filtered_cards = {} with open('your_cards.json', 'r', encoding='utf-8') as f: data = json.load(f) for card_name, card_data in data.items(): if card_data.get('leadershipSkills', {}).get('commander') is True: filtered_cards[card_name] = card_data # 保存筛选结果 with open('filtered_commander_cards.json', 'w', encoding='utf-8') as f: json.dump(filtered_cards, f, indent=2)
方法二:Node.js实现
常规体积文件处理:
const fs = require('fs'); // 若JSON含注释用jsonc-parser解析,无注释可直接用JSON.parse const { parse } = require('jsonc-parser'); // 读取并解析文件 const rawData = fs.readFileSync('your_cards.json', 'utf8'); const cards = parse(rawData); // 筛选符合条件的卡片 const filteredCards = Object.entries(cards).reduce((acc, [cardName, cardData]) => { if (cardData.leadershipSkills?.commander === true) { acc[cardName] = cardData; } return acc; }, {}); // 写入结果文件 fs.writeFileSync('filtered_commander_cards.json', JSON.stringify(filteredCards, null, 2), 'utf8');
超大文件流式处理(需安装stream-json库):
const { parser } = require('stream-json'); const { streamValues } = require('stream-json/streamers/StreamValues'); const fs = require('fs'); const { Writable } = require('stream'); const filteredCards = {}; const pipeline = fs.createReadStream('your_cards.json') .pipe(parser()) .pipe(streamValues()) .pipe(new Writable({ objectMode: true, write({ key, value }, _, callback) { if (value.leadershipSkills?.commander === true) { filteredCards[key] = value; } callback(); } })); pipeline.on('finish', () => { fs.writeFileSync('filtered_commander_cards.json', JSON.stringify(filteredCards, null, 2), 'utf8'); });
内容的提问来源于stack exchange,提问作者Alexa Aria
相关产品推荐
相关产品推荐

