如何使用PYTHON 3的子字符串格式化JSON项OrderedDic转储

如何使用PYTHON 3的子字符串格式化JSON项OrderedDic转储,python,json,python-3.x,csv,ordereddict,Python,Json,Python 3.x,Csv,Ordereddict,我正在尝试转换一个Json文件 { # "item_1":"value_11", # "item_2":"value_12", # "item_3":"value_13", # "item_4":["sub_value_14", "sub_value_15"], # "item_5":{ # "sub_item_1":"sub_item_value_11", # "sub_item_2":["sub_item_value_12", "sub_item_

我正在尝试转换一个Json文件

{
#   "item_1":"value_11",
#   "item_2":"value_12",
#   "item_3":"value_13",
#   "item_4":["sub_value_14", "sub_value_15"],
#   "item_5":{
#       "sub_item_1":"sub_item_value_11",
#       "sub_item_2":["sub_item_value_12", "sub_item_value_13"]
#   }
# }
对于类似于以下内容的内容:

 {
#   "node_item_1":"value_11",
#   "node_item_2":"value_12",
#   "node_item_3":"value_13",
#   "node_item_4_0":"sub_value_14", 
#   "node_item_4_1":"sub_value_15",
#   "node_item_5_sub_item_1":"sub_item_value_11",
#   "node_item_5_sub_item_2_0":"sub_item_value_12",
#   "node_item_5_sub_item_2_0":"sub_item_value_13"
# }
我知道在转换为CSV时,您无法保持Json文件的顺序。我正在考虑通过将JSON数据加载到OrderedDic对象(这会导致按照输入文档列出它们的顺序添加它们)来解决问题。但是,我对处理JSON文件以及OrderedDic函数还不熟悉

要将项目拆分为我使用的子组,请执行以下操作:

def reduce_item(key, value):
        global reduced_item

        #Reduction Condition 1
        if type(value) is list:
            i=0
            for sub_item in value:
                reduce_item(key+'_'+to_string(i), sub_item)
                i=i+1

        #Reduction Condition 2
        elif type(value) is dict:
            sub_keys = value.keys()
            for sub_key in sub_keys:
                reduce_item(key+'_'+to_string(sub_key), value[sub_key])

        #Base Condition
        else:
            reduced_item[to_string(key)] = to_string(value)
但是如何使用orderedDic和上述代码来显示此输出:

{
    #   "node_item_1":"value_11",
    #   "node_item_2":"value_12",
    #   "node_item_3":"value_13",
    #   "node_item_4_0":"sub_value_14", 
    #   "node_item_4_1":"sub_value_15",
    #   "node_item_5_sub_item_1":"sub_item_value_11",
    #   "node_item_5_sub_item_2_0":"sub_item_value_12",
    #   "node_item_5_sub_item_2_0":"sub_item_value_13"
    # }
我也有下面的代码,但它不会根据上面子字符串代码的条件将每个代码拆分为子组:

import json
from  collections import OrderedDict
with open("/home/file/official.json", 'r') as fp:
    metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
print(metrics_types)
这表明:


有什么建议吗?

您可以使用一个函数来迭代给定的dict或列表项,并合并递归调用的dict输出中的键:

def flatten(d):
    if not isinstance(d, (dict, list)):
        return d
    out = {}
    for k, v in d.items() if isinstance(d, dict) else enumerate(d):
        f = flatten(v)
        if isinstance(f, dict):
            out.update({'%s_%s' % (k, i): s for i, s in f.items()})
        else:
            out[k] = f
    return out
因此,鉴于:

d = {
  "item_1":"value_11",
  "item_2":"value_12",
  "item_3":"value_13",
  "item_4":["sub_value_14", "sub_value_15"],
  "item_5":{
      "sub_item_1":"sub_item_value_11",
      "sub_item_2":["sub_item_value_12", "sub_item_value_13"]
  }
}
展平(d)
返回:

{'item_1': 'value_11',
 'item_2': 'value_12',
 'item_3': 'value_13',
 'item_4_0': 'sub_value_14',
 'item_4_1': 'sub_value_15',
 'item_5_sub_item_1': 'sub_item_value_11',
 'item_5_sub_item_2_0': 'sub_item_value_12',
 'item_5_sub_item_2_1': 'sub_item_value_13'}

以上假设您使用的是Python 3.7或更高版本,其中dict键保证是有序的。如果您使用的是早期版本,则可以使用
OrderedDict
代替常规dict。

的顺序与上述相同。首先定义函数,为dict
d
指定一个值,然后调用
flatte(d)