You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Qt解析类JSON自定义文件格式:数据提取方案咨询

嘿,刚好处理过类似的类JSON自定义格式,给你几个简洁的思路,不用折腾复杂的自定义解析器就能搞定数据提取:

最省心的方案:先转标准JSON,再用现成工具解析

你的格式和JSON只差几个符号——没有冒号分隔键值、没有逗号分隔项,所以最快的方式是先做轻量的正则替换,把它转换成标准JSON,然后直接用现成的JSON解析库处理,省得自己写递归解析逻辑。

步骤1:正则批量转格式

针对你的格式特点,用正则做3个核心替换就行,以Python为例:

import re

def convert_custom_to_json(custom_script):
    # 把 "key" "value" 改成 "key": "value",
    processed = re.sub(r'"(\w+)"\s+"([^"]+)"', r'"\1": "\2",', custom_script)
    # 把 "key" { 改成 "key": {
    processed = re.sub(r'"(\w+)"\s+{', r'"\1": {', processed)
    # 清理大括号前多余的逗号(避免JSON解析报错)
    processed = re.sub(r',\s*{', r' {', processed)
    # 清理最后一个键值对后的多余逗号
    processed = re.sub(r',\s*}', r' }', processed)
    return processed

把你的示例片段扔进去,输出就是标准的JSON结构,直接就能用json.loads()解析成嵌套字典。

步骤2:递归遍历字典生成树节点

解析得到嵌套字典后,写个简单的递归函数就能把数据导入QTreeWidget(以PyQt为例):

def populate_tree(parent_item, data):
    if isinstance(data, dict):
        for key, value in data.items():
            child_item = QTreeWidgetItem(parent_item, [key])
            populate_tree(child_item, value)
    else:
        # 叶子节点直接显示值
        parent_item.addChild(QTreeWidgetItem([str(value)]))

调用的时候,把QTreeWidget的顶层节点和解析后的字典传进去就行,几行代码就能搞定树结构的构建。

备选方案:手写简易递归解析器

如果你的格式有一些正则覆盖不到的特殊情况(比如字符串里带空格、特殊字符),可以自己写个字符流遍历的解析器:

  • 跳过所有空白字符
  • 遇到双引号就读取完整字符串(作为键)
  • 接着如果碰到{,就递归解析内部内容作为该键的字典值
  • 如果碰到双引号,就读取下一个字符串作为值
    这种方式更灵活,但代码量会比转JSON多一些,适合格式规则复杂的场景。

至于语法高亮,你可以基于这个格式的特征(双引号字符串、大括号、关键字),给文本编辑器控件写个QSyntaxHighlighter子类,匹配对应模式设置颜色就行,这个不算复杂。

内容的提问来源于stack exchange,提问作者Nicholas Johnson

火山引擎 最新活动