2F (Python) - JSON bemenet ellenőrzése

0 votes
asked Apr 12, 2015 in IRF tantárgy by szmate (27 points)  
edited Apr 12, 2015 by szmate

A feladatomban egy megadott formátumú JSON fájlból kell beolvasnom dolgokat. Itt feltételezhető, hogy a paraméterként megadott JSON fájl megfelelő formátumú, vagy kezeljem le a hibákat, ha nem. Gondolok itt pl. a következőre:

Egy JSON object egy Python dictre képződik le, és így megindexelhető egy string kulccsal. Pl. ha a dictet egy config nevű változóval tároltam el, akkor a config["Username"] szintaxissal érhetem el a dict "Username" kulcsához tartozó értéket, ami megfelel az eredeti JSON object ugyanezen kulcsához tartozó értéknek. De mi van, ha a paraméterként megadott JSON fájlban azon a helyen, ahol egy JSON objectnek kellene lennie, pl. egy JSON array van? Ekkor ez egy Python listre képeződik le, és egy string kulccsal való megindexelés esetén TypeError hiba dobódik ("list indices must be integers, not str"). Ha JSON object van, akkor meg tudom indexelni, de pl. ha nem létezik a "Username" kulcs, akkor KeyError keletkezik.

A kérdés az, hogy ilyenkor mi a jó megoldás: (a) ellenőrizzem, hogy mire képződött le az adott JSON entitás, majd nézzem meg, hogy létezik-e az adott kulcs; vagy (b) kapjam el az esetlegesen keletkező hibákat; vagy (c) ne foglalkozzak ezzel, és feltételezzem, hogy a megadott JSON fájl olyan formátumú, amilyet a feladatban megadtak?

Megjegyzés: persze ha a bemenet pl. nem is JSON, vagy hibás a szintaxisa, akkor a parse-olásnál már hiba keletkezik, így a kérdés nem erre irányul, hanem arra, hogy mit tegyek, ha a bemenet egy szintaktikailag helyes JSON fájl, csak éppen mást tartalmaz, mint amit a szkript várna.

Előre is köszönöm.

1 Answer

+1 vote
answered Apr 12, 2015 by kovari (2,221 points)  
selected Apr 12, 2015 by szmate
 
Best answer

A legjobb megoldás egy json sémával való validálás lenne, de sajnos erre nincs lehetőségünk az alap modulok használatával.

Azonban a type() függvény segítségével ellenőrizni tudod a beolvasott struktúra típusát, továbbá a kulcsok felől is meggyőződhetsz, hogy valóban léteznek-e a bemeneti fájlban. Szóval érdemes ezeket elvégezni, közvetlenül a betöltés után.

commented Apr 12, 2015 by szmate (27 points)  
Köszönöm. A JSON séma validálást néztem én is, de láttam, hogy beépített modul nincs erre.

A kérdésem még annyi lenne, hogy mennyire érdemes szigorúnak lenni az ellenőrzéskor? A JSON objectben "Host", "Username", "Password", "Port" és "Protocol" kulcsoknak kell lennie, de pl. hibás-e ha nincsen megadva port? Végül is port megadása nélkül is működik a wsman parancs. Vagy ha nincs host megadva, akkor vehető úgy, hogy a helyi gépen keresünk? A protokoll esetében annyi van írva, hogy csak a http-t kell támogatni, de ha nem "http" van megadva, akkor az hibásnak legyen tekintve és ne is történjen lekérdezés? Vagy ezek már rám van bízva?
...