Python 3.x 类型错误:不可损坏的类型:';dict';,将内联for循环输出写入JSON文件时

Python 3.x 类型错误:不可损坏的类型:';dict';,将内联for循环输出写入JSON文件时,python-3.x,class,dictionary,code-generation,Python 3.x,Class,Dictionary,Code Generation,我试图制作一个程序,根据用户的输入生成一个JSON文件 JSON文件将用于创建一个python文件,其中包含一个使用JSON文件生成的类(此处未显示) 提交输入后,您可以选择是否要在JSON对象中创建新实例。提交“Y/Y”时,可以创建新实例。之后,如果您提交“N/N”,我会得到错误 import json class GenerateSchema: rounds = 0 # This list stores instances = [] while True:

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

JSON文件将用于创建一个python文件,其中包含一个使用JSON文件生成的类(此处未显示)

提交输入后,您可以选择是否要在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\u模式必须返回值列表才能将其转储到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
    ]

我解决了这个问题,通过循环遍历
实例
列表,并根据实例的名称创建一个新的嵌套字典。如果您两次输入相同的实例名称,第二次输入将覆盖第一次输入(我仍然需要使用不同的实例名称)

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

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()

感谢您的帮助。

此错误是由于尝试制作一组词典而导致的。字典是不易损坏的,因为它们是易变的。