如何使用python将包含键值对的嵌套列表转换为json格式

如何使用python将包含键值对的嵌套列表转换为json格式,python,json,Python,Json,我有['key','value']格式列表,其中也包含子列表。如何在python中将嵌套列表转换为JSON格式 [[' key ', ' 1542633482511430199' ], ['value=>>>BasicData', [['isConfirmAndOrder', '0'],['brmRequestId', 'BR-2018-0000124'], ['requestType','batch'],['projectId', 'PRJ-2018-000047

我有['key','value']格式列表,其中也包含子列表。如何在python中将嵌套列表转换为JSON格式

[[' key ', ' 1542633482511430199'
 ],
 ['value=>>>BasicData',
  [['isConfirmAndOrder', '0'],['brmRequestId', 'BR-2018-0000124'],
  ['requestType','batch'],['projectId', 'PRJ-2018-0000477'],
  ['createdOn', 'Mon Nov 19 18:48:02 IST 2018']]
 ],    
 ['createdBy=>>>BasicData',
  [['userId', '999996279'],    ['email', 'ITEST275@ITS.JNJ.com'],
  ['firstName', 'Iris'],    ['lastName', 'TEST275'],
  ['ntId', 'itest275'],    ['region', 'NA'],
  [' LastAccessTime ', ' 1542639905785 ']]
 ]
]
例外格式为

{
"key": "1542633482511430199",
"value=>>>BasicData": {
    "isConfirmAndOrder": "0",
    "brmRequestId": "BR-2018-0000124"
        .
},
"createdBy=>>>BasicData": {
    "userId": "999996279",
    "email": "ITEST275@ITS.JNJ.com"
        .
 }
        .
 }
实际上,大数据的格式是:

[
 [
  ['key11','value11']
  ['key12',['key13','value13']]
  ['key14',['key15','value15']]
 ]
[
  ['key21','value21']
  ['key22',['key23','value23']]
  ['key24',['key25','value25']]
 ]
]

您可以为此编写一个简单的递归函数:

def to_dict_recursive(x):
    d = {}
    for key, value in x:
        if isinstance(value, list):
            value = to_dict_recursive(value)
        else:
            value = value.strip()  # get rid of unnecessary whitespace
        d[key.strip()] = value
    return d

to_dict_recursive(x)
# {'createdBy=>>>BasicData': {'displayName': 'Iris TEST275',
#   'email': 'ITEST275@ITS.JNJ.com',
#   'firstName': 'Iris',
#   'lastName': 'TEST275',
#   'ntId': 'itest275',
#   'region': 'NA',
#   'roles': '[0]CG510_DHF_AP_Role',
#   'userId': '999996279'},
#  'formulaDetails=>>>BasicData': {'CreationTime': '1542633482512',
#   'LastAccessTime': '1542639905785',
#   'batchSizeUnits': 'kg<<<<<<',
#   'hitCount': '1',
#   'version': '1'},
#  'key': '1542633482511430199',
#  'value=>>>BasicData': {'brmRequestId': 'BR-2018-0000124',
#   'createdMonth': 'Nov',
#   'createdOn': 'Mon Nov 19 18:48:02 IST 2018',
#   'department': 'Global Packaging',
#   'gxp': '1',
#   'id': '1542633482511430199',
#   'isConfirmAndOrder': '0',
#   'isFilling': 'false',
#   'projectId': 'PRJ-2018-0000477',
#   'projectName': 'Automation_Product_By_Admin',
#   'requestType': 'batch',
#   'status': 'New',
#   'statusDescription': 'Batch request created',
#   'updatedOn': 'Mon Nov 19 18:48:02 IST 2018'}}

由于对象中的某些元素显然不是键和值的两元素列表,因此可以添加一个简单的防范措施:

def to_dict_recursive(x):
    d = {}
    try:
        for key, value in x:
            if isinstance(value, list):
                value = to_dict_recursive(value)
            else:
                value = value.strip()
            d[key.strip()] = value
    except ValueError:
        return x
    return d

x = [[' key ', ' 1542633482511430199'],
 ["test", ["a", "b", "c"]]
]
to_dict_recursive(x)
# {'key': '1542633482511430199', 'test': ['a', 'b', 'c']}

请注意,如果
mylist
是一个键值对列表,那么
dict(mylist)
只返回它的字典版本。棘手的部分是深入到这些嵌套列表中,用字典替换它们。下面是一个递归函数,它可以做到这一点:

# Where <kv> is your giant list-of-lists.
def kv_to_dict(kv):
    if isinstance(kv, list):
        kv = dict(kv)
    for k in kv:
        if isinstance(kv[k], list):
            kv[k] = kv_to_dict(kv[k])
    return kv

newdict = kv_to_dict(kvpairs)

我看你也试过类似的方法,但还是出错了。您确定数据中的所有列表都是真正的键值对,而不是一个包含3个字符串的列表吗

感谢Graphir,但是当我在大数据上编写此代码时,它通过一个错误是:ValueError:无法解包的值太多(预期为2)==对于函数to_udict\u recursive(x)。@mahesh,这意味着某些条目与示例中的条目不同。似乎有些条目不止一个键和一个值,也许有时候你有一个简单的列表作为值,而不是一个代表字典的列表?只需
尝试
,除了
,就可以找出错误。我会看看我是否能想出一个解决办法。@mahesh:只是补充说长度不为2的iterables将保持原样。
# Where <kv> is your giant list-of-lists.
def kv_to_dict(kv):
    if isinstance(kv, list):
        kv = dict(kv)
    for k in kv:
        if isinstance(kv[k], list):
            kv[k] = kv_to_dict(kv[k])
    return kv

newdict = kv_to_dict(kvpairs)
import json
as_json = json.dumps(newdict, indent=4)
print(as_json)