python - 使用 Python 创建复杂的 JSON 并创建一些有条件的嵌套数组
问题描述
在使用 Python 动态创建较大 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'的“字段”和“值”对象之外,它有自己的.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' 的唯一名称):
[{
"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)"
]
}]
}
]
解决方案
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)
推荐阅读
- data-visualization - 如何在表格中将面板条形图转换为多折线图
- laravel - 已解决 Laravel 8 更新图像并删除旧图像
- kubernetes - 如何使用 Terraform 配置 EKS ALB
- ruby - 在 RubyMine 中运行 Cucumber 测试场景时出错
- python - 需要事先调用 fit 或 load_model :dask_ml。xgboost 错误
- javascript - 如何在没有 JSON 的情况下在 Javascript 中获取 PHP 数组值?
- pyspark - 无法在使用 Pyspark 创建的 dbt 模型中显示注释
- elasticsearch - elasticsearch简单聚合后的基数聚合
- android-studio - Android Studio底部菜单渲染问题
- git - 如何向 git-lfs 跟踪的文件添加过滤器?