使用Python创建复杂的JSON,创建一些有条件的嵌套数组

问题描述 投票:1回答:2

在使用Python动态创建更大的JSON字符串的一部分时,我想添加一个对象(嵌套字典包含列表和字典,或者最终转换为JSON时的对象和数组)只有当更高级别的值(在我的情况下表名称中)是一个特定的价值。

到目前为止,结构是一个TNFL,我想有条件地将另一个对象与“字段”和“值”一起添加到结构中。

到目前为止我所拥有的:

constJSON = []
i = 0
for k, v in datDictNorm.iteritems():
    constJSON.append({"table":k, "inserts":[]})
    if v:
        for d in v:
            flds = list(d.keys())
            constJSON[i]["inserts"].append({
                              "fields": flds,
                              "values": [d[f] for f in flds]
            })
        i += 1

当表'k'等于'table_x'时,我需要内部最多的.append / for循环来添加另一个对象/值以及名为'nestedTableInsert'的“values”对象,该对象具有它自己的.append函数在我的最终JSON中只为特定的表创建另一个层,以便它看起来像这样但具有正确的语法:

我想做什么工作:

constJSON = []
i = 0
for k, v in datDictNorm.iteritems():
    constJSON.append({"table": k, "inserts": []})
    if v:
        for d in v:
                flds = list(d.keys())
        if k != "name":
            constJSON[i]["inserts"].append({
                    "fields": flds,
                    "values":  [d[f] for f in flds]})
        else:
            for k2, v2 in prvDictNorm.iteritems():
                constJSON[i]["inserts"].append({
                    "fields": flds,
                    "values":  [d[f] for f in flds],
                    "nestedTableInsert": []})

        i += 1

添加了“nestedTableInsert”:对象的结构与它的父插入对象相同,因此最终的JSON看起来像(特别是'nestedTableInserts'为ea唯一名称):

[{
            "table": "place",
            "inserts": [{
                "fields": [
                    "id",
                    "alt_id"
                ],
                "values": [
                    1,
                    1
                ]
            }]
        },
        {
            "table": "data_source",
            "inserts": [{
                "fields": [
                    "id",
                    "col_nm_1",
                    "col_val_1",
                    "valid_from_date",
                    "valid_to_date"
                ],
                "values": [
                    1,
                    "xyz",
                    "1234",
                    "2019-04-16T00:00:00.000Z",
                    "2020-04-16T00:00:00.000Z"
                ]
            }]
        },
        {
            "table": "type",
            "inserts": [{
                "fields": [
                    "id",
                    "alt_id",
                    "type_id",
                    "some_num"
                ],
                "values": [
                    2,
                    1,
                    1,
                    1
                ]
            }]
        },
        {
            "table": "name",
            "inserts": [{
                    "fields": [
                        "some_num",
                        "some_id",
                        "some_other_id",
                        "name"
                    ],
                    "values": [
                        2,
                        1,
                        1,
                        "Minnie Mouse Town"
                    ],
                    "nestedTableInsert": {
                        "table": "prv_feat_nm_li",
                        "inserts": [{
                            "fields": [
                                "id",
                                "col_nm_1",
                                "col_val_1",
                                "nm_type",
                                "nm_ns",
                                "sys_rank",
                                "user_rank",
                                "some_abbr",
                                "some_info",
                                "valid_from_date",
                                "valid_to_date"
                            ],
                            "values": [
                                1,
                                "xyz",
                                "12345",
                                "C",
                                "Minnie Mouse Town",
                                "1",
                                "1",
                                "Q",
                                "Maybe some info here.",
                                "2019-04-16T00:00:00.000Z",
                                "2020-04-16T00:00:00.000Z"
                            ]
                        }]
                    }
                },
                {
                    "fields": [
                        "some_num",
                        "some_id",
                        "some_other_id",
                        "name"
                    ],
                    "values": [
                        2,
                        1,
                        1,
                        "Mickey Mouse Town"
                    ],
                    "nestedTableInsert": {
                        "table": "prv_feat_nm_li",
                        "inserts": [{
                            "fields": [
                                "id",
                                "col_nm_1",
                                "col_val_1",
                                "nm_type",
                                "nm_ns",
                                "sys_rank",
                                "user_rank",
                                "some_abbr",
                                "some_info",
                                "valid_from_date",
                                "valid_to_date"
                            ],
                            "values": [
                                1,
                                "uni",
                                "12346",
                                "C",
                                "Mickey Mouse Town",
                                "1",
                                "1",
                                "Z",
                                "Maybe some info here.",
                                "2019-04-16T00:00:00.000Z",
                                "2020-04-16T00:00:00.000Z"
                            ]
                        }]
                    }
                }
            ]
        },
        {
            "table": "geometry",
            "inserts": [{
                "fields": [
                    "id",
                    "some_other_id",
                    "created",
                    "longitude",
                    "latitude",
                    "shape"
                ],
                "values": [
                    1,
                    1,
                    "No",
                    55.5555555,
                    8.8888888,
                    "POINT(55.5555555 8.8888888)"
                ]
            }]
        }
    ]
python json ordereddictionary ordereddict
2个回答
1
投票
constJSON = []
i = 0
for k, v in datDictNorm.iteritems():
    constJSON.append({"table": k, "inserts": []})
    if v:
        for d in v:
            flds = list(d.keys())
            constJSON[i]["inserts"].append({
                "fields": flds,
                "values": [d[f] for f in flds]
            })
            if k == "table_x":
                constJSON[i]["nestedTableInsert"].append({
                    "fields": flds2,
                    "values": [d2[f2] for f2 in flds2 if k in thing]
                })
        i += 1

myJSON = json.dumps(constJSON)

1
投票

然而,90%有这个,但是创建的嵌套表插入字段和值数组使用相同的记录信息填充,而不是创建与每个父place_nm插入关联的唯一nestedTableInsert记录信息。仍然需要弄清楚这个最内层的迭代。

tableInsert = []
i = 0
for k, v in mainDictNorm.iteritems():
    tableInsert.append({"table": k, "inserts": []})
    if v:
        for d in v:
            flds = list(d.keys())
            if k != "place_nm":
                tableInsert[i]["inserts"].append({
                    "fields": flds,
                    "values":  [d[f] for f in flds]})
            else:
                i = 0
                nestedTableInsert = []
                for k2, v2 in nestDictNorm.iteritems():
                    nestedTableInsert.append({"table": k2, "inserts": []})
                    if v2:
                        for d2 in v2:
                            flds2 = list(d2.keys())
                    tableInsert[i],nestedTableInsert[i]["inserts"].append({
                        "fields": flds2,
                        "values":  [d2[f2] for f2 in flds2]})
                    i += 1
                tableInsert[i]["inserts"].append({
                    "fields": flds,
                    "values":  [d[f] for f in flds],
                    "nestedTableInsert": nestedTableInsert})
        i += 1
© www.soinside.com 2019 - 2024. All rights reserved.