【问题标题】:Parsing the data in a JSON file and converting it to a SQL table解析 JSON 文件中的数据并将其转换为 SQL 表
【发布时间】:2020-01-04 14:19:37
【问题描述】:

我正在构建一个测试软件作为一个副项目。我收到了 JSON 格式的测试题。我打算解析 JSON 并将其存储到具有以下架构的 SQL 表中:-

TABLE NAME - QUESTIONS
QUESTION_NO - INT (PRIMARY KEY) - AUTO_INCREMENT,
QUESTION_DESC - VARCHAR(255),
OPTA - VARCHAR(255),
OPTB - VARCHAR(255),
OPTC - VARCHAR(255),
OPTD - VARCHAR(255),
CORRECTOPT - VARCHAR(1) [Should be 'A','B','C','D']

JSON 格式如下:-

[
    {
        "1": "Total number of ATP produced during Kreb's cycle",
        "2": "what is referred to as reference carbohydrate?"
    },
    {
        "1": {
            "a": "8",
            "b": "11",
            "c": "12",
            "d": "36"
        },
        "2": {
            "a": "glucose",
            "b": "glyceraldehde",
            "c": "fructose",
            "d": "lactose"
        }
    },
    {
        "1": "12",
        "2": "glyceraldehyde"
    }
]

我最初尝试编写一个 Python 代码来解析 JSON,如下所示:-

import json

with open('BIOset1.json') as f:
    data = json.load(f)

print(data)

这里 BIOset1.json 是我要解析的 JSON 文件的名称。 但是,我收到以下错误:-

raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

谁能帮我解析这个 JSON 文件并检索以下格式的数据,以便我可以将数据插入到 SQL 表中?

我来自非编程背景,我正试图通过这些问题为我的大学带来真正的改变。

任何帮助将不胜感激。

[{
        "QUESTION_DESC": "Total number of ATP produced during Kreb's cycle",
        "OPTA": "8",
        "OPTB": "11",
        "OPTC": "12",
        "OPTD": "36",
        "CORRECTOPT": "C"
    },
    {
        "QUESTION_DESC": "what is referred to as reference carbohydrate?",
        "OPTA": "glucose",
        "OPTB": "fructose",
        "OPTC": "lactose",
        "OPTD": "aldehyde",
        "CORRECTOPT": "B"
    }
]

【问题讨论】:

    标签: python mysql json


    【解决方案1】:
    #Create a function that accepts json and outputs the required format 
    #code tested on python3
        def format_json(data):
            #solution list
            final_list = []
            ###questions formatting
            ques_desc_1 = data[0].get("1")
            ques_desc_2 = data[0].get("2")
            ###answer
            answ_1 = data[1].get("1")
            answ_2 = data[1].get("2")
            ###correct answers
            corr_1 = data[2].get("1")
            corr_2 = data[2].get("2")
            ####
            #dictionary = for question 1
            dict1 = {"QUESTION_DESC": ques_desc_1,
                     }
            # "CORRECTOPT": data[2].get("1")
            #loop through options available for answer
            option_dict =[]
            for item in answ_1.items():
                #append
                option_dict.append(item)
            dict1.update({
                "OPTA": option_dict[0][1],
                "OPTB": option_dict[1][1],
                "OPTC": option_dict[2][1],
                "OPTD": option_dict[3][1],
            })
    
            ##
            dict1.update({"CORRECTOPT": dict1.get("OPTC")})
    
            # dictionary = for question 2
            dict2 = {"QUESTION_DESC": ques_desc_2,
                     }
            # "CORRECTOPT": data[2].get("1")
            # loop through options available for answer
            option_dict2 = []
            for item in answ_2.items():
                # append
                option_dict2.append(item)
            #update
            dict2.update({
                "OPTA": option_dict2[0][1],
                "OPTB": option_dict2[1][1],
                "OPTC": option_dict2[2][1],
                "OPTD": option_dict2[3][1],
            })
            ##
            dict2.update({"CORRECTOPT": dict2.get("OPTC")})
            #########
            final_list.append(dict1)
            final_list.append(dict2)
            ###
            print(final_list)
    
        if __name__ == '__main__':
            #sample list
            list_dict = [
            {
                "1": "Total number of ATP produced during Kreb's cycle",
                "2": "what is referred to as reference carbohydrate?"
            },
            {
                "1": {
                    "a": "8",
                    "b": "11",
                    "c": "12",
                    "d": "36"
                },
                "2": {
                    "a": "glucose",
                    "b": "glyceraldehde",
                    "c": "fructose",
                    "d": "lactose"
                }
            },
            {
                "1": "12",
                "2": "glyceraldehyde"
            }]
            #function to format data
            format_json(list_dict)
    

    【讨论】:

    • 我怎样才能修改这个程序来处理n个问题而不是2个问题?
    【解决方案2】:

    首先,除了拼写错误 ("b": "glyceraldehde") 之外,我在您的 JSON 中没有发现任何错误。所以肯定还有别的问题。以下几乎可以完成这项工作:

    import json
    
    data = """[
        {
            "1": "Total number of ATP produced during Kreb's cycle",
            "2": "what is referred to as reference carbohydrate?"
        },
        {
            "1": {
                "a": "8",
                "b": "11",
                "c": "12",
                "d": "36"
            },
            "2": {
                "a": "glucose",
                "b": "glyceraldehyde",
                "c": "fructose",
                "d": "lactose"
            }
        },
        {
            "1": "12",
            "2": "glyceraldehyde"
        }
    ]"""
    
    data = json.loads(data)
    
    results = [{"QUESTION_DESC": data[0][k],
                "OPTA": data[1][k]["a"],
                "OPTB": data[1][k]["b"],
                "OPTC": data[1][k]["c"],
                "OPTD": data[1][k]["d"],
                "CORRECTOPT": data[2][k]} for k in data[0].keys()]
    
    for result in results:
        print(result)
    

    打印:

    {'QUESTION_DESC': "Total number of ATP produced during Kreb's cycle", 'OPTA': '8', 'OPTB': '11', 'OPTC': '12', 'OPTD': '36', 'CORRECTOPT': '12'}
    {'QUESTION_DESC': 'what is referred to as reference carbohydrate?', 'OPTA': 'glucose', 'OPTB': 'glyceraldehyde', 'OPTC': 'fructose', 'OPTD': 'lactose', 'CORRECTOPT': 'glyceraldehyde'}
    

    问题在于CORRECTOP 的值需要更改为包含该值的实际选项字母。所以我们需要后期调整:

    for result in results:
        correctopt = result["CORRECTOPT"]
        for opt in ["A", "B", "C", "D"]:
            if correctopt == result["OPT" + opt]:
                result["CORRECTOPT"] = opt
                break
    
    for result in results:
        print(result)
    

    打印:

    {'QUESTION_DESC': "Total number of ATP produced during Kreb's cycle", 'OPTA': '8', 'OPTB': '11', 'OPTC': '12', 'OPTD': '36', 'CORRECTOPT': 'C'}
    {'QUESTION_DESC': 'what is referred to as reference carbohydrate?', 'OPTA': 'glucose', 'OPTB': 'glyceraldehyde', 'OPTC': 'fructose', 'OPTD': 'lactose', 'CORRECTOPT': 'B'}
    

    您可以使用以下命令将其转换回 JSON:json.dumps(result)

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多