Конвертировать список в JSON в Python - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующее в списке:

['allowUsageAnalytics, Yes', 'application, f5app', 'costcenter, f5costcenter', 'customImageId, OPTIONAL', 'declarationUrl, none', 'environment, f5env', 'group, f5group', 'imageName, Good25Mbps', 'instanceType, m3.large', 'managementSubnetAz1, subnet-073d3f3d04195f0c5', 'managementSubnetAz2, subnet-0ccfbd4eee88fcc5c', 'ntpServer, 0.pool.ntp.org', 'owner, f5owner', 'restrictedSrcAddress, 0.0.0.0/0', 'restrictedSrcAddressApp, 0.0.0.0/0', 'sshKey, chzhang', 'subnet1Az1, subnet-0cc1233b3ffeab89b', 'subnet1Az2, subnet-065b60bb848a3530a', 'timezone, UTC', 'Vpc, vpc-0fc1a35688397512f']

Мне нужно преобразовать его в приведенный ниже JSON:

[
  {
    "ParameterKey": "allowUsageAnalytics",
    "ParameterValue": "Yes"
  },
  {
    "ParameterKey": "application",
    "ParameterValue": "f5app"
  }
]

Это код:

print(json.dumps([{'ParameterKey': x, 'ParameterValue': y} for x, y in content], indent=4))

Но я получаю следующую ошибку:

File "/Users/a/PycharmProjects/BIGIP-DevOps/CFT_print.py", line 22, in <module>
    print(json.dumps([{'ParameterKey': x, 'ParameterValue': y} for x, y in content], indent=4))
  File "/Users/a/PycharmProjects/BIGIP-DevOps/CFT_print.py", line 22, in <listcomp>
    print(json.dumps([{'ParameterKey': x, 'ParameterValue': y} for x, y in content], indent=4))
ValueError: too many values to unpack (expected 2)

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы можете разбить каждый элемент в вашем списке на ", ", а затем использовать конструктор dict.

import json
print(json.dumps(dict(map(lambda x: x.split(", "), content)), indent=4))

Что приводит к:

{
    "group": "f5group", 
    "restrictedSrcAddress": "0.0.0.0/0", 
    "declarationUrl": "none", 
    "managementSubnetAz2": "subnet-0ccfbd4eee88fcc5c", 
    "subnet1Az1": "subnet-0cc1233b3ffeab89b", 
    "ntpServer": "0.pool.ntp.org", 
    "managementSubnetAz1": "subnet-073d3f3d04195f0c5", 
    "sshKey": "chzhang", 
    "subnet1Az2": "subnet-065b60bb848a3530a", 
    "environment": "f5env", 
    "application": "f5app", 
    "customImageId": "OPTIONAL", 
    "imageName": "Good25Mbps", 
    "restrictedSrcAddressApp": "0.0.0.0/0", 
    "costcenter": "f5costcenter", 
    "owner": "f5owner", 
    "timezone": "UTC", 
    "Vpc": "vpc-0fc1a35688397512f", 
    "instanceType": "m3.large", 
    "allowUsageAnalytics": "Yes"
}

Как @faisal указал , чтобы получить желаемый результат, вы можете расширить его до:

print(
    json.dumps(
        [
            {'ParametersKey':x, 'ParameterValue':y} 
            for x,y in dict(map(lambda x: x.split(', '), content)).items()
        ], 
        indent=4
    )
)
#[
#    {
#        "ParameterValue": " f5group", 
#        "ParametersKey": "group"
#    }, 
#    {
#        "ParameterValue": " 0.0.0.0/0", 
#        "ParametersKey": "restrictedSrcAddress"
# ... and so on
0 голосов
/ 24 мая 2019

content - это список многих элементов.for x, y in content не является допустимым итератором.

Вам нужно вложить выражения:

for elem in content

, чтобы перебрать строки,

for x, y in elem.split(", ")

, чтобы получить дваслова в каждой строке.

Можете ли вы взять его оттуда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...