0

我目前有一些代码可以遍历 JSON 文件,获取每个对象并按字母顺序对键值对进行排序。某些键被插入到订单的前面,特别是名称和描述。

def walk_json(data, first=False):
    if isinstance(data, (dict)):
        if not first:
            data = OrderedDict(sorted(data.items()))
        for key, value in data.items():
            data[key] = walk_json(value)

    if isinstance(data, (list)):
        for index, item in enumerate(data):
            data[index] = walk_json(item)
    return data


def validate_json(filename):
    fp = None
    data = None

    try:
        fp = open(filename)
    except OSError:
        print(f"\nERROR {filename}\n")
        return

    try:
        data = json.load(fp, object_pairs_hook=OrderedDict)
    except ValueError:
        print(f"\nINVALID {filename}\n")
        badJSON.append(filename)
        return
    finally:
        fp.close()

    if data is None:
        print(f"EMPTY {filename}")
        return

    ordered = OrderedDict()
    if "display_name" in data:
        ordered["display_name"] = data["display_name"]
    if "description" in data:
        ordered["description"] = data["description"]

    ordered.update(sorted(data.items()))
    data = walk_json(ordered, True)

我有另一个文件,它是一个带有单个键的对象build_list,它是一个包含多个对象的数组。我无法弄清楚如何执行与上述相同的操作,但对于data["build_list"]. 键在每个对象中按字母顺序排序,但我试图将键"name"固定到每个对象的开头没有成功。

代码不是我的,所以我不会假装我完全理解它。我只是想稍微适应一下。

4

1 回答 1

0
def reorder_keys(obj):
    if isinstance(obj, dict):
        new_obj = OrderedDict()
        for key in key_order:
            if key in obj:
                new_obj[key] = reorder_keys(obj[key])

        for key, value in obj.items():
            new_obj[key] = reorder_keys(value)

        return new_obj

    if isinstance(obj, list):
        return list(map(reorder_keys, obj))

    return obj


# Format all the AI files and reorder the object keys
for file in Path("server/pa/ai").glob("**/*.json"):
    data, warnings = pajson.loadf(file)
    list(map(print, warnings))

    data = reorder_keys(data)

    with open(file, "w") as f:
        f.write(pajson.dumps(data, indent=2))
        f.write("\n")
于 2022-01-02T14:12:08.037 回答