如何从嵌套的JSON中获取平面JSON?

时间:2017-06-18 03:23:34

标签: python json python-2.7

我有一个嵌套的JSON,我需要"Max"&来自它的"Remaining"百分比值。

这是我想到的100-(Remaining/Max)*100=(Value)

的示例公式

示例JSON:

{
    "ConcurrentAsyncGetReportInstances":
      {
        "Max": 5,
        "Remaining": 3
    },
    "DailyApiRequests": 
      {

        "Max":15000,"Remaining":14108
      }
}

这是JSON输出。

我需要将%值添加到键

示例输出:

{
    "ConcurrentAsyncGetReportInstances":40,(%value) 100-(5/3)*100
    "DailyApiRequests": 5.95(%value) 100-(14108/15000)*100

}

解决方法:

  • 试图让它成为一个扁平的JSON而且工作但没有帮助我
  • 致力于将JSON转换为CSV并尝试了一些但很难

有人建议最好这样做吗?如果可能,提供一些例子。一些帮助也将不胜感激。

注意:我使用的是Python 2.7

4 个答案:

答案 0 :(得分:1)

现在有一个名为flatten_json的Python包。提供了介绍here

该页面的一个例子 -

在你的shell中:

> pip install flatten_json

在Python控制台中:

from flatten_json import flatten
input_dict = {
    "a": 1,
    "b": 2,
    "c": [{"d": [2, 3, 4], "e": [{"f": 1, "g": 2}]}]
}
print(flatten(input_dict))

结果:

{'a': 1,
 'b': 2,
 'c_0_d_0': 2,
 'c_0_d_1': 3,
 'c_0_d_2': 4,
 'c_0_e_0_f': 1,
 'c_0_e_0_g': 2}

我已经在Python 3.6和2.7中对此进行了测试。

答案 1 :(得分:0)

您可以使用json库检索嵌套值,如下所示:

import json
sample_json = '{"ConcurrentAsyncGetReportInstances":{"Max": 5,"Remaining": 3},"DailyApiRequests": {"Max":15000,"Remaining":14108}}'

jason = json.loads(sample_json)
cagri_max = jason['ConcurrentAsyncGetReportInstances']['Max']
cagri_rem = jason['ConcurrentAsyncGetReportInstances']['Remaining']

答案 2 :(得分:0)

首先接收你的json并将其转换为字典

import json
input_dict = json.loads(<your received son string>)

然后通过递归调用处理输入dict,如下所示:

input_dict = {
     "ConcurrentAsyncGetReportInstances":
       {
         "Max": 200,"Remaining":200
        }, 
     "DailyApiRequests": 
        { 
         "Max": 15000, "Remaining": 14108, 
         "Ant Migration Tool": {"Max": 0, "Remaining": 0},
         "Chatter Desktop": {"Max": 0, "Remaining": 0}, 
         "Chatter Mobile for BlackBerry":
         {"Max": 0, "Remaining": 0},
         "Chemical Equipment And Processing": 
         {"Max": 0,"Remaining": 0}
        } 
     }

def flattenjson(input_dict, odict):
    for ky in input_dict.keys():
        if isinstance(input_dict[ky], dict):
            if set(['Max', 'Remaining']).issubset(input_dict[ky].keys()):
                if input_dict[ky]["Max"] != 0:
                    odict[ky] = 100-(float(input_dict[ky]["Remaining"])/input_dict[ky]["Max"])*100
                else:
                    odict[ky] = 0
            for iky in input_dict[ky].keys():
                if isinstance(input_dict[ky][iky], dict):
                    tmp = {iky : input_dict[ky][iky]}
                    odict = flattenjson(tmp, odict)
    return odict

odict = flattenjson(input_dict, dict())
print json.dumps(odict) 

flattenjson可帮助您递归处理以获取所有Max和Remaining条目的所需输出

答案 3 :(得分:0)

您不需要展平数据结构。只需引用你想要的那些部分 - 例如,我认为以下内容基本上符合你的要求:

import json

json_data = {
                "ConcurrentAsyncGetReportInstances": {
                    "Max": 5,
                    "Remaining": 3
                },
                "DailyApiRequests": {
                    "Max": 15000,
                    "Remaining": 14108
                }
            }

def percentage_values(remaining, maximum):
    return 100 - (float(remaining)/float(maximum)) * 100

# build output dictionary
json_out = {}
for key in json_data:
    value = percentage_values(json_data[key]["Remaining"], json_data[key]["Max"])
    json_out.update([(key, value)])

print(json.dumps(json_out, indent=4))

显示json_out内容的结果输出是:

{
    "ConcurrentAsyncGetReportInstances": 40.0, 
    "DailyApiRequests": 5.9466666666666725
}

在Python中有更简洁的方法来编写它,但它们都会以非常简单的方式完成上述操作。