首页 > 解决方案 > 使用 Python 从现有 JSON 创建自定义 JSON

问题描述

Python 初学者警报)我正在尝试从现有 JSON 创建自定义 JSON。场景是 -

我有一个可以发送许多字段集的源,但我想挑选其中一些并创建其中的一个子集,同时保持原始 JSON 结构

原始样本

{
    "Response": {
        "rCode": "11111",
        "rDesc": "SUCCESS",
        "pData": {
            "code": "123-abc-456-xyz",
            "sData": [
                {
                    "receiptTime": "2014-03-02T00:00:00.000",
                    "sessionDate": "2014-02-28",
                    "dID": {
                        "d": {
                            "serialNo": "3432423423",
                            "dType": "11111",
                            "dTypeDesc": "123123sd"
                        },
                        "mode": "xyz"
                    },
                    "usage": {
                        "duration": "661",
                        "mOn": [
                            "2014-02-28_20:25:00",
                            "2014-02-28_22:58:00"
                        ],
                        "mOff": [
                            "2014-02-28_21:36:00",
                            "2014-03-01_03:39:00"
                        ]
                    },
                    "set": {
                        "abx": "1",
                        "ayx": "1",
                        "pal": "1"
                    },
                    "rEvents": {
                        "john": "doe",
                        "lorem": "ipsum"
                    }
                },
                {
                    "receiptTime": "2014-04-02T00:00:00.000",
                    "sessionDate": "2014-04-28",
                    "dID": {
                        "d": {
                            "serialNo": "123123",
                            "dType": "11111",
                            "dTypeDesc": "123123sd"
                        },
                        "mode": "xyz"
                    },
                    "usage": {
                        "duration": "123",
                        "mOn": [
                            "2014-04-28_20:25:00",
                            "2014-04-28_22:58:00"
                        ],
                        "mOff": [
                            "2014-04-28_21:36:00",
                            "2014-04-01_03:39:00"
                        ]
                    },
                    "set": {
                        "abx": "4",
                        "ayx": "3",
                        "pal": "1"
                    },
                    "rEvents": {
                        "john": "doe",
                        "lorem": "ipsum"
                    }
                }
            ]
        }
    }
}

这里的sData数组标签有几个标签,我只想保留 24 个并去掉其余的。我知道我可以使用 element.pop() 但我不能在每次源发布时删除一个新的传入字段。以下是预期的输出 -

预期产出

{
    "Response": {
        "rCode": "11111",
        "rDesc": "SUCCESS",
        "pData": {
            "code": "123-abc-456-xyz",
            "sData": [
                {
                    "receiptTime": "2014-03-02T00:00:00.000",
                    "sessionDate": "2014-02-28",
                    "usage": {
                        "duration": "661",
                        "mOn": [
                            "2014-02-28_20:25:00",
                            "2014-02-28_22:58:00"
                        ],
                        "mOff": [
                            "2014-02-28_21:36:00",
                            "2014-03-01_03:39:00"
                        ]
                    },
                    "set": {
                        "abx": "1",
                        "ayx": "1",
                        "pal": "1"
                    }
                },
                {
                    "receiptTime": "2014-04-02T00:00:00.000",
                    "sessionDate": "2014-04-28",
                    "usage": {
                        "duration": "123",
                        "mOn": [
                            "2014-04-28_20:25:00",
                            "2014-04-28_22:58:00"
                        ],
                        "mOff": [
                            "2014-04-28_21:36:00",
                            "2014-04-01_03:39:00"
                        ]
                    },
                    "set": {
                        "abx": "4",
                        "ayx": "3",
                        "pal": "1"
                    }
                }
            ]
        }
    }
}

我自己参考了How can I create a new JSON object form another using Python? 但它没有按预期工作。期待各位大师的意见/解决方案。提前致谢。

标签: pythonjsonpython-3.x

解决方案


有点像这样:

data = json.load(open("fullset.json"))

def subset(d):
    newd = {}
    for name in ('receiptTime','sessionData','usage','set'):
        newd[name] = d[name]
    return newd

data['Response']['pData']['sData'] = [subset(d) for d in data['Response']['pData']['sData']]

json.dump(data, open('newdata.json','w')) 

推荐阅读