2017-11-20 12 views
1

JSONを実際にトレーニングして、2つの異なるキーを使用して新しいJSONをどのように解析できるかを理解しようとしています。私は、データ検証の目的でいくつかのログを並べ替える必要があります。Pythonで複数のキーを使用してJSONを解析およびソートする方法

マイデータJSON

{ 
      "productTitle": "Product", 
      "apiName": "soapwebservice" 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Product", 
      "apiName": "productionservice", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Product", 
      "apiName": "firstapi", 
      "statusCode": "200 OK" 
},   
{ 
      "productTitle": "Product", 
      "apiName": "firstapi", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Suitability", 
      "apiName": "suitability-api", 
      "statusCode": "200 OK" 
} 

出力JSON予想:

{ 
    "Product": 4, 
    "api-activity": { 
     "soapwebservice": 1, 
     "productionservice": 1, 
     "firstapi": 2 
    } 
} 
{ 
    "Suitability": 1, 
    "api-activity": { 
     "suitability-api": 1, 
    } 
} 

これは、解析し、最初のキーカウントする私の最初のコードです:

import json 
from collections import Counter 

with open('events1.json') as json_data: 
    json_obj = json.load(json_data) # Read the JSON file 

    # print(json_obj['calls'][0]['appName']); #Example JSON Extract 
    c = Counter(player['productTitle'] for player in json_obj['calls']) 

with open('output.json', 'w') as f: 
    f.write(json.dumps(c, indent=4)) # Parse and write the file 

print("Translation of JSON"); 

私が探していますが予想されるJSONを取得する方法については、おそらくここで説明するループを使用してください:parse JSON values by multilevel keys しかし、私は期待どおりのJSONを取得することはできません、あなたは何か考えていますか?

答えて

0

itertools.groupby()を使用して、要素を目的のプロパティでグループ化します。最初のグループの製品タイトル、および各結果のグループで、要素をもう一度グループ化しますが、現在はAPI名でグループ化します。希望カウンタは、各結果のグループ内の要素のほんの量である:

import itertools 
import json 

def by_product_title(data): 
    return data['productTitle'] 

def by_api_name(data): 
    return data['apiName'] 

json_str = ''' 
[ 
    { 
     "productTitle": "Product", 
     "apiName": "soapwebservice", 
     "statusCode": "200 OK" 
    }, 
    { 
     "productTitle": "Product", 
     "apiName": "productionservice", 
     "statusCode": "200 OK" 
    }, 
    ... 
] 
''' 

data = json.loads(json_str) 
grouped_by_product_title = itertools.groupby(sorted(data, key=by_product_title), by_product_title) 
for product, group in grouped_by_product_title: 
    elements = list(group) 
    grouped_by_api_name = itertools.groupby(sorted(elements, key=by_api_name), by_api_name) 
    api_activity = {key: len(list(val)) for key, val in grouped_by_api_name} 
    output = {product: len(elements), 'api-activity': api_activity} 
    json_output = json.dumps(output, sort_keys=True, indent=4) 
    print(json_output) 

出力:

{ 
    "Product": 4, 
    "api-activity": { 
     "firstapi": 2, 
     "productionservice": 1, 
     "soapwebservice": 1 
    } 
} 
{ 
    "Suitability": 1, 
    "api-activity": { 
     "suitability-api": 1 
    } 
} 
+0

おかげで、それは魔法のように動作します。私の場合、JSONファイルを使用するときには、json.loadで呼び出す必要があります.json.loadsではなく、コードを試してみる必要があります。 – SandaleRaclette

0

私はこのようにしました。見てみな。

import json 

json_str = """ 
[ 
{ 
      "productTitle": "Product", 
      "apiName": "soapwebservice", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Product", 
      "apiName": "productionservice", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Product", 
      "apiName": "firstapi", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Product", 
      "apiName": "firstapi", 
      "statusCode": "200 OK" 
}, 
{ 
      "productTitle": "Suitability", 
      "apiName": "suitability-api", 
      "statusCode": "200 OK" 
} 
] 
""" 

data_set = json.loads(json_str) 
data_list = [] 
for data in data_set: 
    title = data["productTitle"] 
    exist = False 
    for existing_data in data_list: 
     if title in existing_data: 
      exist = True 
      existing_data[title] += 1 
      if data["apiName"] in existing_data["api-activity"]: 
       existing_data["api-activity"][data["apiName"]] += 1 
      else: 
       existing_data["api-activity"][data["apiName"]] = 1 
    if not exist: 
     new = dict() 
     new[data["productTitle"]] = 1 
     new["api-activity"] = dict() 
     new["api-activity"][data["apiName"]] = 1 
     data_list.append(new) 

print(json.dumps(data_list)) 
0

あなたの最初の問題は、json.load(とjson.loadsが)のみから一つの要素を取るということですファイル。これを修正するには、リストに変換する必要があります。

[ 
    { 
    "productTitle": "Product", 
    "apiName": "soapwebservice", 
    "statusCode": "200 OK" 
    }, 
    { 
    "productTitle": "Product", 
    "apiName": "productionservice", 
    "statusCode": "200 OK" 
    }, 
    { 
    "productTitle": "Product", 
    "apiName": "firstapi", 
    "statusCode": "200 OK" 
    }, 
    { 
    "productTitle": "Product", 
    "apiName": "firstapi", 
    "statusCode": "200 OK" 
    }, 
    { 
    "productTitle": "Suitability", 
    "apiName": "suitability-api", 
    "statusCode": "200 OK" 
    } 
] 

2番目の問題は、存在しないjson_obj ['calls']にアクセスしようとしていることです。アクセサを除去することにより、あなたは、次のコードを取得する:

import json 
from collections import Counter 

with open('events1.json') as json_data: 
    json_obj = json.load(json_data) # Read the JSON file 
    c = Counter(player['productTitle'] for player in json_obj) 

with open('output.json', 'w') as f: 
    f.write(json.dumps(c, indent=4)) # Parse and write the file 

print("Translation of JSON"); 

これはoutput.jsonに次のような出力になり:

{ 
    "Product": 4, 
    "Suitability": 1 
} 
関連する問題