2017-08-04 5 views
0

Ich habe eine Anwendung, in der ein verschachteltes Python-Wörterbuch basierend auf einem JSON-Dokument erstellt wird, das ich als Antwort von einer API erhalte. Beispiel:Validieren Sie Objektwerte gegen YAML-Konfiguration

colleagues = [ 
{ "name": "John", 
    "skills": ["python", "java", "scala"], 
    "job": "developer" 
}, 
{ "name": "George", 
    "skills": ["c", "go", "nodejs"], 
    "job": "developer" 
}] 

Dieses Wörterbuch kann viel mehr verschachtelte Ebenen haben. Was ich tun möchte ist, dass der Benutzer seine eigenen willkürlichen Bedingungen definiert (zB um Kollegen zu finden, die "Python" unter ihren Fähigkeiten haben, oder deren Name "John" ist) in einer YAML Konfigurationsdatei, die ich benutzen werde überprüfe das Python-Wörterbuch.

dachte ich über sie konfigurieren, dass in der folgenden Weise in der YAML-Datei zu lassen, aber dies würde erfordern exec() verwenden, die ich aus Sicherheitsgründen vermeiden wollen:

constraints: 
    - "python" in colleagues[x]["skills"] 
    - colleagues[x]["name"] == "John" 

Welche anderen Möglichkeiten gibt es für eine solche ein Problem, so dass der Benutzer eigene Einschränkungen für die Wörterbuchwerte angeben kann? Auch hier ist das obige Wörterbuch nur ein Beispiel. Die tatsächliche ist viel größer in Größe und Verschachtelung.

Antwort

1

Sie könnten einen Lucene-Abfrageparser verwenden, um Abfragen wie "skill:python" und "name:John" in ausführbare Prädikatfunktionen zu konvertieren und dann die Liste Ihrer Kollegen mit diesen Prädikaten zu filtern. Beim Suchen nach "python lucene parser" werden mehrere Analyseoptionen angezeigt.

+0

Wäre es möglich, den abgerufenen JSON zu verwenden, um den Baum basierend darauf zu erstellen und dann Queries wie "skill: python" und "name: John" zu verwenden, um den Baum abzufragen? Ich möchte nur sicherstellen, dass es keinen Overhead gibt, um den Baum manuell zu erstellen. –

+0

Ja, verwenden Sie Pythons 'json'-Modul, um Ihre Struktur in eine Liste von Dicts zu konvertieren, und verwenden Sie dann die Prädikatfunktionen, die Sie aus den Abfragen erstellen, um nur die gewünschten Dictions herauszufiltern. – PaulMcG

Verwandte Themen