类项目的 Python JSON 格式问题

问题描述 投票:0回答:1

我正在为学校的编程逻辑入门课程开发一个项目,我们从 .txt 文件中读取信息,将其重新格式化为 JSON 格式,然后将该 JSON 格式写入新的 .txt 文件,同时打印JSON 格式的数据显示到屏幕上。

我遇到一个问题,我的 JSON 键值对在不需要引号的数据类型上添加引号,例如整数和布尔值。

def main():
    runtimeManager = RuntimeManager()
    jsonResult = runtimeManager.run()
    outputFileName=runtimeManager.outputFilename
    print(jsonResult)
    print("\nOutput written to " +outputFileName+ ".")

class RuntimeManager:

    def run(self):
        ## Gather required member variables
        self.getUserInputFileName()
        self.getUserOutputFileName()

        ##Grabbing user file and extracting the CSV
        with open(self.inputFilename) as inputFile:
            jsonResult = CsvToJson(inputFile.readlines()).transformCsvToJson()
            with open(self.outputFilename, "w") as outputFile:
                outputFile.write(jsonResult)
            return jsonResult


    def getUserInputFileName(self):
        ## Prompt User for 
        self.inputFilename = input("Enter the filename:  ").strip()

    def getUserOutputFileName(self):
        self.outputFilename = input("Enter the OUTPUT filename:  ").strip()



class CsvToJson():

    def __init__(self, csv):
        self.csv = csv
        self.headers = csv[0].strip()
        self.data = csv[1:]

    def transformCsvToJson(self):
        jsonResult = "{"
        for i in range(0, len(self.data)):
            if (i != 0):
                jsonResult = jsonResult + "\n,"
            jsonResult = jsonResult + "\"" + str(i+1) + "\":" + self.createJsonObject(self.headers, self.data[i])
        return jsonResult + "\n}"

    def createJsonObject(self, headers, csvRow):
        csvKeyArray = headers.split(",")
        csvValueArray = csvRow.strip().split(",")
        jsonObject = "{"
        for i in range(0, len(csvKeyArray)):
            jsonField = ""
            if (i != 0):
                jsonField = ","
            jsonField = jsonField + "\"" + str(csvKeyArray[i]) + "\":" + self.getValueDataType(csvValueArray[i])
            jsonObject = jsonObject + jsonField
        return jsonObject + "}"

    def getValueDataType(self, value):
        if (type(value) == int):
            value = str(value)
        elif (type(value) == str):
            value = "\"" + value + "\""
        elif (type(value) == bool):
            if (value):
                value = "true"
            else:
                value = "false"
        elif (type(value) == null):
            value = "null"
        else:
            value = "ERROR"

        return value


if (__name__ == "__main__"):
    main()

我已将程序和行号放在这里。我的作业规定不允许我们使用 python 内置的 JSON 模块。

我遇到的问题是我的 JSON 格式如下所示:

{“1”:{“姓氏”:“小黄人”,“名字”:“鲍勃”,“首选名称”:“鲍勃”,“首选代词”:“他/他”,“SF ID#” :“2211-4456”,“程序代码”:“3504”,“电话”:“910-432-8765”,“电子邮件”:“[电子邮件受保护]”}

它应该看起来像这样:

{“1”:{“姓氏”:“小黄人”,“名字”:“鲍勃”,“首选名称”:“鲍勃”,“首选代词”:“他/他”,“SF ID #” :“2211-4456”,“程序代码”:3504,“电话”:“910-432-8765”,“电子邮件”:“[电子邮件受保护]”}

程序代码:3504键值对中的代码上没有引号,我不明白为什么要在其上放置引号。

示例输入文件内容如下所示:

Last Name,First Name,Preferred Name,Preferred Pronoun,SF ID #,Program Code,Phone,Email
Minion,Bob,Bob,he/him,2211-4456,3504,910-432-8765,[email protected]
Nichols,James,James,,1234-5678,3651,352-395-5220,[email protected]
Person,Punny,,,9999-1111,3840,352-123-4567,[email protected]
Person,Punny2,,,9999-1112,3841,352-123-6792,[email protected]
Person,Punny3,,,9999-1113,3842,352-123-3420,[email protected]
Smart,Maxwell,Max,,9922-4029,3650,310-2910,[email protected]
Tree,Groot,Groot,,1122-3344,3624,361-1234-5678,[email protected]
python json format
1个回答
0
投票

这是一个如何从您提供的输入生成有效 json 的示例(但要注意:有很多警告和快捷方式,如果不使用

csv
/
json
模块,将很难涵盖所有情况和输入) :

tpl = """\
"{}": {{"Last Name":{},"First Name":{},"Preferred Name":{},"Preferred Pronoun":{},"SF ID #":{},"Program Code":{},"Phone":{},"Email":{}}}"""


def format_val(val):
    if val == "":
        return "null"
    elif isinstance(val, str):
        return f'"{val}"'
    elif isinstance(val, (int, float)):
        return val
    elif isinstance(val, bool):
        return "true" if val else "false"

    raise ValueError(f"Unknown value type {val}")


all_rows = []
with open("out.txt", "r") as f_in:
    for line in map(str.strip, f_in):
        if f_in == "":
            continue
        row = list(map(str.strip, line.split(",")))
        all_rows.append(row)


final_json = []
for i, row in enumerate(all_rows[1:], 1):
    row[5] = int(row[5])
    final_json.append(tpl.format(i, *map(format_val, row)))

final_json = "{" + ",\n".join(final_json) + "}"
print(final_json)

打印:

{"1": {"Last Name":"Minion","First Name":"Bob","Preferred Name":"Bob","Preferred Pronoun":"he/him","SF ID #":"2211-4456","Program Code":3504,"Phone":"910-432-8765","Email":"[email protected]"},
"2": {"Last Name":"Nichols","First Name":"James","Preferred Name":"James","Preferred Pronoun":null,"SF ID #":"1234-5678","Program Code":3651,"Phone":"352-395-5220","Email":"[email protected]"},
"3": {"Last Name":"Person","First Name":"Punny","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1111","Program Code":3840,"Phone":"352-123-4567","Email":"[email protected]"},
"4": {"Last Name":"Person","First Name":"Punny2","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1112","Program Code":3841,"Phone":"352-123-6792","Email":"[email protected]"},
"5": {"Last Name":"Person","First Name":"Punny3","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1113","Program Code":3842,"Phone":"352-123-3420","Email":"[email protected]"},
"6": {"Last Name":"Smart","First Name":"Maxwell","Preferred Name":"Max","Preferred Pronoun":null,"SF ID #":"9922-4029","Program Code":3650,"Phone":"310-2910","Email":"[email protected]"},
"7": {"Last Name":"Tree","First Name":"Groot","Preferred Name":"Groot","Preferred Pronoun":null,"SF ID #":"1122-3344","Program Code":3624,"Phone":"361-1234-5678","Email":"[email protected]"}}
© www.soinside.com 2019 - 2024. All rights reserved.