如何处理非理想JSON?VDF转JSON格式优化技术问询
解决VDF转JSON格式不理想的问题
看起来你在处理Valve专有KeyValue格式的.vdf文件转JSON时,遇到了简易转换器输出格式不佳的问题——比如你给出的示例里JSON输出还出现了截断,而且数字键的处理可能也不符合你的预期。下面给你几个实用的解决方案:
方案1:使用成熟的VDF解析库(推荐)
很多编程语言都有专门针对VDF格式的成熟解析库,能完美处理嵌套结构、数字键等场景,输出规范完整的JSON。以Python为例:
首先安装vdf库:
pip install vdf
然后用以下代码完成转换:
import vdf import json # 读取VDF文件 with open('your_library.vdf', 'r', encoding='utf-8') as f: vdf_content = vdf.load(f) # 转换为格式化的JSON并输出 formatted_json = json.dumps(vdf_content, indent=4) print(formatted_json)
针对你给出的示例VDF输入,这段代码会输出完整且结构规范的JSON:
{ "LibraryFolders": { "TimeNextStatsReport": "1523464730", "ContentStatsID": "8627456721266182211", "1": "G:\\Steam" } }
方案2:手动修正现有转换器的输出
如果不想更换工具,可以针对现有转换器的问题做针对性调整:
- 修复截断问题:检查转换器是否有文件读取长度限制,确保它完整读取整个VDF文件内容;
- 自定义结构调整:如果你希望把数字键(比如示例中的"1")整理为数组而非字符串键,可以写个小脚本处理:
import json # 假设你已经修复了截断后的JSON内容 raw_json = ''' { "LibraryFolders": { "TimeNextStatsReport": "1523464730", "ContentStatsID": "8627456721266182211", "1": "G:\\\\Steam" } } ''' data = json.loads(raw_json) library_data = data["LibraryFolders"] # 分离数字键和普通键,把数字键对应的值整理为数组 folders = [] metadata = {} for key, value in library_data.items(): if key.isdigit(): folders.append(value) else: metadata[key] = value metadata["folders"] = folders data["LibraryFolders"] = metadata # 输出调整后的JSON print(json.dumps(data, indent=4))
调整后的输出会变成更贴合使用习惯的结构:
{ "LibraryFolders": { "TimeNextStatsReport": "1523464730", "ContentStatsID": "8627456721266182211", "folders": [ "G:\\Steam" ] } }
方案3:自定义轻量VDF解析器(按需定制)
如果需要完全自定义转换逻辑,可以自己实现一个简单的VDF解析器,核心是处理VDF的键值对和嵌套大括号结构。以下是Python的一个轻量实现:
import re import json def parse_vdf(vdf_string): # 移除注释和多余空白字符 cleaned_vdf = re.sub(r'//.*', '', vdf_string) cleaned_vdf = re.sub(r'\s+', ' ', cleaned_vdf).strip() stack = [{}] current_key = None # 提取所有键、值和大括号标记 tokens = re.findall(r'"([^"]+)"|\{|\}', cleaned_vdf) for token in tokens: if token == '{': # 进入嵌套结构 if current_key is not None: nested_dict = {} stack[-1][current_key] = nested_dict stack.append(nested_dict) current_key = None elif token == '}': # 退出嵌套结构 stack.pop() else: # 处理键或值 if current_key is None: current_key = token else: stack[-1][current_key] = token current_key = None return stack[0] # 测试示例VDF sample_vdf = ''' "LibraryFolders" { "TimeNextStatsReport" "1523464730" "ContentStatsID" "8627456721266182211" "1" "G:\\Steam" } ''' parsed_result = parse_vdf(sample_vdf) print(json.dumps(parsed_result, indent=4))
这个解析器能准确处理VDF的结构,输出符合预期的JSON,你可以根据自己的需求进一步修改逻辑。
内容的提问来源于stack exchange,提问作者user7937949
相关产品推荐
相关产品推荐

