Как преобразовать строку в список при загрузке из json - PullRequest
2 голосов
/ 02 августа 2020

Json ниже. Мне нужно преобразовать в список после загрузки из json. Я получаю str

{
  "1": {
    "Data (L)": "[  { \"S\" : \"168\" }]"
  },
  "2": {
    "Data (L)": "[  { \"S\" : \"169\" }]"
  }
}

Код

with open('a.json') as f:
    a = json.loads(f.read())
print (a)
data1 = []
for i,j in a.items():
    data = {}
    data['id'] = i
    data1.append(data)
    for k,l in j.items():
        data[k] = l
        print (type(l))
        print (l)

Мой тип pf l равен <class 'str'>, где вывод l равен [ { "S" : "168" }]

Ожидается

тип печати (l) должен быть списком, а не str

Ответы [ 2 ]

3 голосов
/ 02 августа 2020

Я предполагаю, у вас двойная кодировка json. Просто вызовите другой json.loads() по значениям вторых словарей:

import json

json_text = r'''{
  "1": {
    "Data (L)": "[  { \"S\" : \"168\" }]"
  },
  "2": {
    "Data (L)": "[  { \"S\" : \"169\" }]"
  }
}'''

data = json.loads(json_text)

for k, v in data.items():
    for kk, vv in v.items():
        vv = json.loads(vv)
        print(type(vv))
        print(vv)

Выводит:

<class 'list'>
[{'S': '168'}]
<class 'list'>
[{'S': '169'}]
0 голосов
/ 02 августа 2020

Это не рекомендуемый метод!

Это небезопасно использовать eval() таким образом. См. Eval действительно опасно . (Спасибо @ KarlKnechtel за комментарий !)

Вместо ast.literal_eval() можно использовать. См. Использование функции eval () python по сравнению с ast.literal_eval ()? . (Спасибо @ Sushanth за комментарий !)

Первоначальный ответ ниже

Вы можете использовать встроенную функцию eval(), например:

s = "[  { \"S\" : \"168\" }]"
t = eval(s)

print(t)
print(type(t))
print(t[0])
print(type(t[0]))

которая печатает

[{'S': '168'}]
<class 'list'>
{'S': '168'}
<class 'dict'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...