Использование Python для создания сложного JSON с условием создания некоторых вложенных массивов - PullRequest
1 голос
/ 22 апреля 2019

При использовании 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, чтобы добавить еще один объект / значение в дополнение кОбъект «fields» и «values» с именем nestedTableInsert, имеющий собственную функцию .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)"
                ]
            }]
        }
    ]

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

90% при этом, однако создаваемые массивы полей и значений вложенной вложенной таблицы заполняются одинаковой информацией о записи и не создают уникальную информацию о записи nestedTableInsert, связанную с каждой родительской вставкой place_nm.Еще нужно выяснить итерацию на этом самом внутреннем слое.

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
1 голос
/ 22 апреля 2019
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)
...