TypeError: unhashable type: 'dict', when writing inline for loop output to JSON file

TypeError: unhashable type: 'dict', when writing inline for loop output to JSON file

我正在尝试制作一个程序,根据用户的输入生成 JSON 文件。

然后 JSON 文件将用于创建 python 文件,并使用 JSON 文件(此处未显示)生成 class。

提交输入后,您可以选择是否要在 JSON 对象中创建新实例。当您提交 'Y/y' 时,您可以创建一个新实例。之后,如果您提交 'N/n',我会收到错误。

import json

class GenerateSchema:
    rounds = 0

    # This list stores
    instances = []
    while True:
        if len(instances) == 0:
            schema_filename = input("*.json filename: ")
            class_name = input("ClassName: ")

        instance_name = input("First instance name: ")
        instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
        instance_description = input("Instance description (OPTIONAL): ")

        keep_generating = input("Generate another instance? [Y/N]: ")
        if keep_generating == "Y" or keep_generating == "y":

            # Appends user inputs to 'instances' list
            instances.append([instance_name, instance_params, instance_description])
            rounds += 1
        else:
            break

    def generate_schema(self):
        with open(self.schema_filename + ".json", "w") as schema_file:  
            # Writes the JSON object to the JSON file. This line gives me the error.
            schema_file.write(json.dumps(self.return_schema()))
            schema_file.close()


    def return_schema(self):
        # Returns a JSON object based on user inputs
        return {
                {
                    "class": {
                        "name": self.class_name,
                        "instance": {
                            "name": instance[0],
                            "parameters": "self" + instance[1],
                            "description": instance[2]
                        }
                    }
                } for instance in self.instances
            }

schema_gen = GenerateSchema()
schema_gen.generate_schema()

如果你不明白我的代码,请告诉我。希望并感谢任何帮助或建议。 (我已经看过同样错误的其他问题,但他们没有给我解决方案)。

谢谢。

您的方法 return_schema 必须 return 值列表才能将其转储到 JSON。

def return_schema(self):
    # Returns a JSON object based on user inputs
    return [
            {
                "class": {
                    "name": self.class_name,
                    "instance": {
                        "name": instance[0],
                        "parameters": "self" + instance[1],
                        "description": instance[2]
                    }
                }
            } for instance in self.instances
    ]

我解决了这个问题,方法是遍历 instances 列表并根据实例名称创建一个新的嵌套字典。如果两次输入相同的实例名称,则第二次输入会覆盖第一次(我仍然需要要求具有不同的实例名称)

生成的 JSON 实例超过 1 个(取决于您提交的实例数量)。我所做的是使用 for loop 为每个实例创建一个新的嵌套字典。代码如下:

import json


class GenerateSchema:
    rounds = 0
    instances = []
    while True:
        if len(instances) == 0:
            schema_filename = input("*.json filename: ")
            class_name = input("ClassName: ")

        instance_name = input("Instance name: ")
        instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
        instance_description = input("Instance description (OPTIONAL): ")

        keep_generating = input("Generate another instance? [Y/N]: ")
        if keep_generating == "Y" or keep_generating == "y":
            instances.append([instance_name, instance_params, instance_description])
            rounds += 1
        elif keep_generating == "N" or keep_generating == "n":
            instances.append([instance_name, instance_params, instance_description])
            break
        else:
            print("[Y/N] please: ")

    def generate_schema(self):
        make_file = open(self.schema_filename + ".json", "w")
        make_file.write('{}')
        make_file.close()

        with open(self.schema_filename + ".json", "r+") as f:
            data = json.load(f)

            data[self.class_name] = {
                "name": self.class_name,
            }

            if not self.instance_params:
                for instance in self.instances:
                    data[self.class_name][instance[0]] = {
                        "name": instance[0],
                        "parameters": "self",
                        "description": instance[2]
                    }    

            else:
                for instance in self.instances:
                    data[self.class_name][instance[0]] = {
                        "name": instance[0],
                        "parameters": "self, " + instance[1],
                        "description": instance[2]
                    } 

            f.seek(0)
            json.dump(data, f)
            f.truncate()

Thank-you 你的帮助。