Получить значение того же подключа файла json - PullRequest
0 голосов
/ 02 февраля 2020

Я хочу конвертировать один 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. Для ответа Правый вывод может быть

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

или есть какой-либо другой способ, например, использование pandas фрейма данных. Я знаю, что это длинный и глупый вопрос, но я буду рад, если кто-нибудь сможет помочь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Мое решение более «pandasoni c», чем другой ответ.

Начните с определения функции, которая будет использоваться для изменения кода ответа на 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"}
}

( отличается от формата ввода, предложенного в другом ответе).

0 голосов
/ 02 февраля 2020

Как насчет этого?

# 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}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...