Строку преобразить в словарь

Рейтинг: 0Ответов: 1Опубликовано: 13.03.2023

Имеется строка такого вида:

import json
import ast

s='''
{
"VM": "b17592fe-cd14-4462-aba0-decf35677b4a",
"Name": "backup-vm",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "up",
"Disks": [
    {
        "Name": "bk",
        "Description": "none",
        "Format": "cow",
        "Size": 53689188352
    }
]
},
{
"VM": "7035097b-84ee-41c4-8a0b-7cec405d2d8b",
"Name": "chill_vm",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "down",
"Disks": []
},
{
"VM": "ceb1f243-ce53-4cc2-acb6-767e40f52659",
"Name": "HostedEngine",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 2,
"RAM": 4294967296,
"State": "up",
"Disks": [
    {
        "Name": "he_virtio_disk",
        "Description": "Hosted-Engine disk",
        "Format": "raw",
        "Size": 85899345920
    }
]
},
{
"VM": "6bc577cb-a92c-4bbd-9973-34186ce2ee42",
"Name": "kek_vm",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "down",
"Disks": []
},
{
"VM": "c2f04f6c-5da5-41b5-9d4a-a0a3a054fb05",
"Name": "os_enc",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "down",
"Disks": []
},
{
"VM": "34f48d6c-e174-4931-a48e-691fac3218a4",
"Name": "Server-IPA",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "down",
"Disks": [
    {
        "Name": "Server-IPA_Disk1",
        "Description": "none",
        "Format": "raw",
        "Size": 53687091200
    }
]
},
{
"VM": "aa9fb932-6be5-4c59-b97b-3bfbb12b600c",
"Name": "test_vm",
"CPU Name": null,
"CPU Speed": null,
"CPU Architecture": "x86_64",
"CPU Cores": 1,
"RAM": 1073741824,
"State": "down",
"Disks": [
    {
        "Name": "wizard",
        "Description": "none",
        "Format": "cow",
        "Size": 10737418240
    }
]
}
'''
f=ast.literal_eval(s)
print(f)

Ошибка такие:

f=ast.literal_eval(s)

Traceback (most recent call last):
File "/home/alex/src/rv-vm-backup-dev/tt.py", line 111, in <module>
f=ast.literal_eval(s)
File "/usr/lib/python3.10/ast.py", line 62, in literal_eval
node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')
File "/usr/lib/python3.10/ast.py", line 50, in parse
return compile(source, filename, mode, flags,
File "<unknown>", line 20
{
^
SyntaxError: invalid syntax

или если через json.loads

Traceback (most recent call last):
File "/home/alex/src/rv-vm-backup-dev/tt.py", line 111, in <module>
 f=json.loads(s)
File "/usr/lib/python3.10/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.10/json/decoder.py", line 340, in decode
raise JSONDecodeError("Extra data", s, end) 
json.decoder.JSONDecodeError: Extra data: line 19 column 2 (char 383)

Как такую строку преобразовать в словарь?

Ответы

▲ 2Принят

В строке содержится не один объект, а несколько отдельных. Надо засунуть их в список:

s = "[" + s + "]" 

После этого json.loads заработал