2015-02-28 10 views
5

Con questo codiceControllare se la chiave/valore è in JSON

import sense 
import json 

sense.api_key = '...' 
node = sense.Node.retrieve('........') 
feed = node.feeds.retrieve('presence') 

events = feed.events.list(limit=1) 

result = json.dumps(events,indent=1) 
print result 

ottengo un JSON-Feed in questo modo:

{ 
"links": {...}, 
"objects": [ 
    { 
    "profile": "GenStandard", 
    "feedUid": ".....", 
    "gatewayNodeUid": ".....", 
    "dateServer": "2015-02-28T09:57:22.337034", 
    "geometry": null, 
    "data": { 
    "body": "Present", 
    "code": 200 
    }, 
    "signal": "-62", 
    "dateEvent": "2015-02-28T09:57:22.000000", 
    "type": "presence", 
    "payload": "2", 
    "nodeUid": "....." 
    } 
], 
"totalObjects": 875, 
"object": "list" 
} 

Come si può verificare se il 'corpo' è 'presente' (o 'codice' è '200')? Il mio script deve restituire VERO o FALSO

UPDATE

Se posso aggiungere questo codice come proposto nelle risposte funziona benissimo:

d=json.loads(result) 
def checkJson(jsonContents): 
    bodyFlag = True if "body" in jsonContents["objects"][0]["data"] and jsonContents["objects"][0]["data"]["body"] == "Present" else False 

    return bodyFlag 

print checkJson(d) 
+1

Questo perché si sta dumping La JSON, si dovrebbe usare sia 'D = json.loads (risultato)' o semplicemente caricare il JSON prima. –

+0

Thx, quella era la soluzione! – Simon

+0

non ti preoccupare, devi anche usare 'in' per trovare il se '' body'' è il ditt, le altre risposte sono alla ricerca di un valore' Present' che immagino non sia quello che vuoi. Presumo per 'presente' che vuoi dire esiste –

risposta

5

si dovrebbe anche forse verificare se la chiave corpo è in realtà Là.

def checkJson(jsonContents): 
    bodyFlag = True if "body" in jsonContents["objects"][0]["data"] and jsonContents["objects"][0]["data"]["body"] == "Present" else False 
    codeFlag = True if "code" in jsonContents["objects"][0]["data"] and jsonContents["objects"][0]["data"]["code"] == 200 else False 

    return bodyFlag or codeFlag 

print checkJson(result) 
+1

Stai scendendo lo stesso ramo - __jsonContents [" objects "] [0] [" data "] __ 4 volte! In tal caso, è consuetudine assegnare un valore a una variabile intermedia. E tu usi l'operatore ternario per assegnare un valore booleano! E se la 1a condizione è _True_ - non è necessario valutare il 2 ° – volcano

3
d = json.loads(results) 
objs = d["objects"][0] 
# see if any code is either == 200 or "body" is a key in the subdict 
return any(x for x in (objs["data"]["code"] == 200,"body" in objs["data"])) 
+0

Perché utilizzare _any_ solo per 2 valori? _or_ semplice farà – volcano

Problemi correlati