2017-09-27 892 views
1

我有一些JSON文件:解析JSON数组在Python

{ 
    "cis" : [ { 
    "ucmdbId" : "835cfedfaabc32a1358b322ff3bae056", 
    "type" : "running_software", 
    "properties" : { 
     "display_label" : "jboss (site1.ru)" 
    } 
    }, { 
    "ucmdbId" : "7ef9f21c132c12b3d8d2af0964cc5970", 
    "type" : "node", 
    "properties" : { 
     "display_label" : "site2.ru" 
    } 
    } ], 
    "relations" : [ { 
    "ucmdbId" : "80c42edbe32fbb4c25621756ec9e09d2", 
    "type" : "compound_f", 
    "properties" : null, 
    "end1Id" : "23e30baf2320a3274d0aa1e7f56cdaef", 
    "end2Id" : "15af0ba134327d32a0c5c72450e63fcd" 
    }, { 
    "ucmdbId" : "7fe9fb15d4462d1212aeee4aef2f32b4", 
    "type" : "compound_f", 
    "properties" : null, 
    "end1Id" : "23e30baf2320a3274d0aa327f56cdaef", 
    "end2Id" : "9232dd2621b814da632932e8cd33ffc8" 
    } ] 
} 

我需要带记:

[{ 
    "ucmdbId" : "835cfedfaabc32a1358b322ff3bae056", 
    "type" : "running_software", 
    "display_label" : "jboss (site1.ru)" 
}, { 
    "ucmdbId" : "7ef9f21c132c12b3d8d2af0964cc5970", 
    "type" : "node", 
    "display_label" : "site2.ru" 
}] 

,我只需要 '顺' 阵列。 我尝试在Python:

#!/usr/bin/python 
import sys 
import os 
import tablib 
import pandas as pd 
import json 
from pandas.io.json import json_normalize 

f = open('/home/nik/test.json', 'rw') 
jsonArray = f.read() 
f.close 
data = json.dumps(json.loads(jsonArray)['cis']) 
jsonResult = pd.read_json(data) 
array = json.loads(jsonArray) 

print jsonArray 
jsonResult.to_excel('/home/nik/output.xlsx', sheet_name='Sheet1') 

,但我怎么能得到关键参数? 我尝试使用:

*打印数据[ '类型']键()

打印数据[ '类型'] *

但具有错误:

AttributeError的:“STR '对象没有属性'键'。

我该如何获得正确的json格式?

+1

data ['type']'返回类似''running_software''的东西。这是一个字符串,而不是字典。 – poke

+0

data ['type']'是一个'str'对象,即''running_software''或''node'''。这个对象没有'.key()'方法。你期望会发生什么? – Alfe

回答

0
import json 
from pprint import pprint 
jsonfile = 'C:\\temp\\temp.json' # path to your json file 
with open(jsonfile) as data_file:  
    data = json.load(data_file) 
pprint(data['cis']) 

以上将给你顺式数组。 下面是一个更精细的输出

for item in data['cis']: 
    ucmdbId = (item['ucmdbId']) 
    type = (item['type']) 
    display_label = (item['properties']['display_label']) 
    print(ucmdbId) 
    print(type) 
    print(display_label) 

如果你想它的按键标签,然后使用

for item in data['cis']: 
    ucmdbId = (item['ucmdbId']) 
    type = (item['type']) 
    display_label = (item['properties']['display_label']) 
    print('ucmdbId:{}'.format(ucmdbId)) 
    print('type:{}'.format(type)) 
    print('display_label:{}'.format(display_label)) 
0

谢谢,它的工作原理。我在xlsx文件中输出json的完整代码:

#!/usr/bin/python 
import subprocess 
import sys 
import os 
import tablib 
import pandas as pd 
import json 
import glob 
import string 

path = '/home/nik/json' 
for jsonfile in glob.glob(os.path.join(path, '*.json')): 
#jsonfile = '/home/nik/test.json' 
    with open(jsonfile) as data_file: 
     data = json.load(data_file) 

    JSON = '[{ \n' 
    for index, item in enumerate(data['cis']): 
     ucmdbId = (item['ucmdbId']) 
     type = (item['type']) 
     display_label = (item['properties']['display_label']) 
     Text1 = ' \"ucmdbId\" : \"%s\",' %(ucmdbId) 
     Text2 = ' \"type\" : \"%s\",' %(type) 
     Text3 = ' \"display_label\" : \"%s\",' %(display_label) 
     if index==(len(data['cis'])-1): 
      End = '}]' 
     else: 
      End = '}, {' 
     JSON += Text3+'\n'+Text2+'\n'+Text1+'\n'+End+'\n' 

    JSON = JSON.translate({ord(c): None for c in '\/'}) 
    jsonResult = pd.read_json(JSON) 
    jsonResult = jsonResult.sort_values(by='type') 
    jsonResult.to_excel(jsonfile+'.xlsx', sheet_name='Object monitoring', index=False)