2016-09-14 11 views
1

私はこれにまね見えるJSONデータのセットを持っている:はJSON構造内の文字列を返す、JSONの検索

import json 
import pprint 

with open('file.json') as dataFile: 
    data = json.load(dataFile) 
:私は以下のようにPythonのでそれをこれを取られ、解析されてきた

{"executions": [ 
{ 
    "id": 17, 
    "orderId": 16, 
    "executionStatus": "1", 
    "cycleId": 5, 
    "projectId": 15006, 
    "issueId": 133038, 
    "issueKey": "QTCMP-8", 
    "label": "", 
    "component": "", 
    "projectKey": "QTCMP", 
    "executionDefectCount": 0, 
    "stepDefectCount": 0, 
    "totalDefectCount": 0 
}, 
{ 
    "id": 14, 
    "orderId": 14, 
    "executionStatus": "1", 
    "cycleId": 5, 
    "projectId": 15006, 
    "issueId": 133042, 
    "issueKey": "QTCMP-10", 
    "label": "", 
    "component": "", 
    "projectKey": "QTCMP", 
    "executionDefectCount": 0, 
    "stepDefectCount": 0, 
    "totalDefectCount": 0 
    } 
    ], 
    "currentlySelectedExecutionId": "", 
    "recordsCount": 4 
} 

これでデータ["実行"]などを実行して実行のようなデータセットを見つけることができました。構造内で文字列 "QTCMP-8"を検索する必要があります。特定の文字列を見つけ、その文字列に関連付けられている "id"を見つけます。したがって、QTCMP-8の場合はid 17となります。 QTCMP-10の場合は14となります。

これは可能ですか?最初にデータを変換する必要がありますか?どんな助けでも大歓迎です!

+0

あなたは 'issueKey'キーまたは' projectKey' –

+0

に対応する値をチェックする必要がありますか –

答えて

1

あなたは(1)、少なくともそれが今どのようなものであるかとOの計算順序でこれを行うことはできません。以下は、各検索の複雑さがO(n)である解法です。 (1)、O(n)との前処理を必要とするOでこれを行う

id = None 
for dic in executions: 
    if dic['issueKey'] == query: 
     id = dic['id'] 
     break 

は、これであなたは、彼らのissueKeyによって処刑を分類し、必要な情報をその中に保存します。

# Preprocessing of O(n) 
mapping = dict() 
for dic in executions: 
    mapping[dic['issueKey']] = { 
     'id': dic['id'], 
     'whatever': 'whateverel' 
    } 

# Now you can query in O(1) 

return dic[query]['id'] 

また、あなたが重いのJSONクエリをやっている場合は、それのMongoDBまたは同類での作業を検討する必要があります。

+0

を使って 'issueKey'が必要だと仮定して答えを加えました' dict() 'を使うのは一般的には良いことではありません - 空の' dict'を宣言する '{}'を使う方がはるかに優れています。 (それは名前ルックアップを必要としません、それは穴の最適化が可能で、その名前は別の名前のない関数や変数などによってシャドーされている可能性があります)。 –

+0

また、後の例をdict-compとして書くこともできます: 'mapping = {d ['issueKey']:d for d [d executions ']}' –

+0

@JonClementsもっと良い方法を指摘してくれてありがとう!ちゃんと覚えておきますよ。しかし、私が理解することについては、特に、OPがあまりPythonに慣れていないような場合には、より洗練された構文を提供する方が良いと思います。 – SpiXel

0

仕事をする条件との単純な反復処理は:

for execution in data['executions']: 
    if "QTCMP" in execution['issueKey']: 
     print(execution["id"]) 

# -> 17 
# -> 14 
0

あなたのように、すべてのIDのリストを取得することができます:

my_jsonは、あなたのJSON構造

注格納する変数である

>>> [item['id'] for item in my_json['executions'] if item['issueKey'].startswith('QTCMP')] [17, 14] 

あなたがのIDを必要とするように私の代わりに'QTCMP' in item['issueKey']item['issueKey'].startswith('QTCMP')を使用していますがQTCMPで始まる項目。値がXXXQTCMPである場合、それはidは結果を呈するべきではありません(それはin文を使用してTrueとなります)です

関連する問題