【问题标题】:Get value of same subkey of json file获取json文件相同子键的值
【发布时间】:2020-05-18 15:58:45
【问题描述】:

我想将一种 json 文件格式转换为另一种格式。 输入 json 文件的样子,

json1 = {"Roll Number":{"0":"12345675890"},"Exam Code":{"0":"125"},"q1":{"0":"A"},"q2":{"0":"B"},"q3":{"0":"B"},"q4":{"0":"C"},"q5":{"0":"C"}

这里你可以认为0是第0个学生(第一个学生的答题卡)

我想要这种输出格式,

json2 = {
            "id": 1, 
            "Roll Number": 12345675890, 
            "Exam Code": 125,
            "qtn_ans_id": 1, #this is question number
            "field1": 0, 
            "field2": 0,
            "field3": 1, #if ans is C then field3=1 and else is 0
            "field4": 0,
        }

在json1中它包含5个问题答案和详细信息,我想将它转换成json2,我的代码是

import json

将 json 文件存储到数据中

with open('json1.json') as data_file:
  data = json.load(data_file)

写入默认格式

format = {"table": "omr",
    "rows":
    [
        {
            "id": 1,
            "regist_no": 1215152,
            "exam_id": 125,
            "qtn_ans_id": 1,
            "field1": 0,
            "field2": 0,
            "field3": 0,
            "field4": 0,    
        }
    ]
}

我的虚拟代码

json2 = {}

for (k, v) in data.items():
  if(k=='Roll Number'):
    format['rows'][0]['regist_no']=v['0']
  if(k=='Exam Code'):
     format['rows'][0]['exam_id'] = v['0']
  if(v['0']=='A'):
     format['rows'][0]['field1'] = 1
  elif(v['0']=='B'):
     format['rows'][0]['field2'] = 1
  elif(v['0']=='C'):
     format['rows'][0]['field3'] = 1
  elif(v['0']=='D'):
     format['rows'][0]['field4'] = 1


  json2.append(format['rows']) 

我得到的错误输出是,

[{
   'field1': 1,
   'field2': 1,
   'field3': 1,
   'field4': 1
}]

所有字段值为 1。 对于答案 A Right 输出可以是,

[{
   'field1': 1,
   'field2': 0,
   'field3': 0,
   'field4': 0
}]

或者有没有其他方法,比如使用熊猫数据框。 我知道这是一个冗长而愚蠢的问题,但如果有人能提供帮助,我会很高兴。谢谢!

【问题讨论】:

    标签: python json pandas list


    【解决方案1】:

    这样的事情怎么样?

    # assuming your json data looks like this:
    json1 = [
        {
            "Roll Number" : {"0":"12345675890"},
            "Exam Code" : {"0":"125"},
            "q1" : {"0":"A"},
            "q2" : {"0":"B"},
            "q3" : {"0":"B"},
            "q4" : {"0":"C"},
            "q5" : {"0":"C"},
        },
        {
            "Roll Number" : {"0":"12345675891"},
            "Exam Code" : {"0":"125"},
            "q1" : {"0":"C"},
            "q2" : {"0":"B"},
            "q3" : {"0":"A"},
            "q4" : {"0":"C"},
            "q5" : {"0":"D"},
        },
    ]
    

    然后:

    # converts old question field to new question field:
    def ConvertAnswer(question):
    
        # get letter answer from question:
        for key, value in question.items():
            letter = value
    
        # pack fields object:
        fields = {
            'field1' : 1 if letter == 'A' else 0, 
            'field2' : 1 if letter == 'B' else 0,
            'field3' : 1 if letter == 'C' else 0,
            'field4' : 1 if letter == 'D' else 0,
        }
    
        return fields
    
    
    # iterate over each student:    
    for student in json1:
    
        # iterate over each field in student:
        for key, value in student.items():
    
            # check for questions (check if key starts with 'q'):
            if key[0] == 'q':
    
                # replace question field in student object:
                student[key] = ConvertAnswer(value)
    

    将导致:

    # output of json1:    
    [{'Roll Number': {'0': '12345675890'},
      'Exam Code': {'0': '125'},
      'q1': {'field1': 1, 'field2': 0, 'field3': 0, 'field4': 0},
      'q2': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
      'q3': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
      'q4': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
      'q5': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0}},
     {'Roll Number': {'0': '12345675891'},
      'Exam Code': {'0': '125'},
      'q1': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
      'q2': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
      'q3': {'field1': 1, 'field2': 0, 'field3': 0, 'field4': 0},
      'q4': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
      'q5': {'field1': 0, 'field2': 0, 'field3': 0, 'field4': 1}}]
    

    【讨论】:

    • 谢谢你,我得到它的字段。在两个学生的 json1 中,它的格式是 json1 = [ { "Roll Number" : {"0":"12345675890"}, "Exam Code" : {"0":"125"}, "q1" : {"0":"A"}, "q2" : {"0":"B"}, "q3" : {"0":"B"}, "q4" : {"0":"C"}, "q5" : {"0":"C"}, }, { "Roll Number" : {"1":"12345675891"}, "Exam Code" : {"1":"125"}, "q1" : {"1":"C"}, "q2" : {"1":"B"}, "q3" : {"1":"A"}, "q4" : {"1":"C"}, "q5" : {"1":"D"}, } ]for 第二个学生索引是 1 而不是 0。
    • 那么如何将第二个学生的卷号和字段附加到输出列表中?
    • 我明白了 - 我已经编辑了上面的代码 - 如果它不起作用,请告诉我。
    【解决方案2】:

    我的解决方案比其他答案更“pandasonic”。

    从定义一个函数开始,它会被用来改变 4个答案栏的答案代码:

    def ans(code):
        return pd.Series([ int(code == x) for x in 'ABCD' ],
            index=[ 'field' + str(i) for i in range(1, 5)])
    

    将您的输入文件读入 DataFrame,如下所示:

    with open('input.json') as data_file:
        df = pd.read_json(data_file, orient='columns')
    

    然后重新格式化,保存在另一个 DataFrame 中:

    df2 = pd.wide_to_long(df.rename_axis(index='id').reset_index(),
        stubnames='q', i='Roll Number', j='qtn_ans_id').reset_index()\
        .reindex(columns=['id', 'Roll Number', 'Exam Code', 'qtn_ans_id', 'q'])
    

    现在它包含一列 q 和答案代码。 因此,要将其更改为每个字段的 4 列,请运行:

    df2 = df2.join(df2.q.apply(ans)).drop(columns=['q'])
    

    最后一步是创建输出 JSON 字符串:

    df2.to_json(orient='records')
    

    你可以例如保存在输出文件中。

    注意:如果您的输入包含例如2名学生的数据, JSON 文件应具有以下格式:

    {
      "Roll Number":{"0":12345675890,"1":23456758901},
      "Exam Code":{"0":125,"1":125},
      "q1":{"0":"A","1":"A"},
      "q2":{"0":"B","1":"B"},
      "q3":{"0":"B","1":"C"},
      "q4":{"0":"C","1":"D"},
      "q5":{"0":"C","1":"C"}
    }
    

    (不同于其他答案中提出的输入格式)。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2018-09-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多