Das Paket robust-json ist eine leichte, aber leistungsfähige Bibliothek für die Arbeit mit JSON-Dateien und -Objekten in Python.
Sie können dieses Paket direkt von PyPI installieren:
pip install robust-json
Diese Bibliothek wird nur auf Python 3.x unterstützt.
Wenn Sie dieses Projekt verbessern möchten, besprechen Sie zunächst Ihre Idee, indem Sie eine neue Ausgabe eröffnen. Danach teilen Sie dieses Repository auf und implementieren diese tolle Funktion oder beheben diesen lästigen Fehler. Erstellen Sie dann eine neue PR und warten Sie auf die Genehmigung.
Hinweis: Bitte lesen Sie zuerst die Datei „contributing.md“. Dort finden Sie Verhaltensregeln und nützliche Informationen zum Beitragsprozess.
Diese Bibliothek umfasst 4 Module:
Dieses Modul bietet verschiedene Methoden zum Arbeiten mit JSON-Dateien über die JsonFileParser -Klasse. Es analysiert und lädt automatisch gültiges JSON aus der angegebenen Datei und prüft außerdem, ob die Datei zur Verarbeitung bereit ist. Um darauf zuzugreifen, importieren Sie einfach JsonFileParser aus dem Dateimodul:
from robust_json.file import JsonFileParser
und initialisiere es:
op = JsonFileParser(path_to_json_file)
Hinweis: JsonFileParser unterstützt jetzt das automatische Speichern. Wenn aktiviert, speichert das Modul das aktive Objekt nach jeder daran vorgenommenen Änderung und schreibt es in die angegebene Datei.
Um das automatische Speichern zu aktivieren, initialisieren Sie einfach dieses Modul mit dem Parameter autosave
auf True
eingestellt:
op = JsonFileParser(path_to_json_file, autosave=True)
Hinweis: Sie können auch eine Datei für den Autosaver angeben. Übergeben Sie bei der Initialisierung einfach den Parameter autosave_path
mit dem Pfad zu Ihrer Datei, etwa so:
op = JsonFileParser(path*to_json_file, autosave=True, autosave_path=path_to_autosave_file)
Wenn die Datei nicht vorhanden ist, erstellt das Modul eine. Wenn eine Datei vorhanden ist, wird sie gekürzt und mit dem serialisierten aktiven Objekt gefüllt.
Während der Initialisierung kann eine JSONFileError -Ausnahme ausgelöst werden. Dies bedeutet, dass der Parser den Inhalt der angegebenen Datei nicht verarbeiten konnte oder die Datei eine nicht unterstützte Erweiterung hat. Außerdem kann in dieser Phase ein FileNotFoundError ausgelöst werden, der anzeigt, dass die angegebene Datei nicht vorhanden ist. Die Fehlermeldung „IncorrectFunctionParameterTypeError“ wird ausgelöst, wenn einer oder mehrere Parameter falsche Typen haben.
Eigenschaften :
JsonFileParser.file_formats Diese Eigenschaft listet alle von diesem Modul unterstützten Dateierweiterungen in Form eines Arrays auf. Derzeit werden nur .json- und .txt- Dateien unterstützt. Dies wird während der Klasseninitialisierung verwendet, um festzustellen, ob die Datei verarbeitet werden kann.
JsonFileParser.path Diese Eigenschaft gibt den Quelldateipfad zurück
JsonFileParser.active_json Diese Eigenschaft gibt ein JSON-Objekt mit allen letzten Änderungen zurück.
JsonFileParser.backup Diese Eigenschaft gibt das ursprüngliche JSON-Objekt zurück und ignoriert alle letzten Änderungen. Diese beiden letzten Eigenschaften können verwirrend sein, daher hier ein Beispiel ( Hinweis: siehe entsprechenden Dokumentationsabschnitt für die Funktion JsonFileParser.append() ):
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') #Class initialization
# Contents of 'test1.json' file: {'test_key': 'test_value'}
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonFileParser.backup property is equal to initial contents of 'test1.json' file.
# This is useful when there is a need to discard all changes to JSON object.
Methoden :
JsonFileParser.get_json_from_file() Diese Methode ruft den gesamten JSON-Code aus der Datei ab und gibt ihn als Python-Wörterbuch zurück. Der Aufruf erfolgt automatisch, wenn die angegebene Datei zum ersten Mal verarbeitet wird.
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') # JsonFileParser.get_json_from_file() function is called here
JsonFileParser.get_key_value(json_path: str) Diese Methode greift auf einen Wert aus einem bestimmten Schlüssel:Wert-Paar im JSON-Objekt zu und gibt ihn zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar an (z. B. field0.field1.[...].fieldn). Beispiel:
from robust_json.file import JsonFileParser
op = JsonFileParser('test2.json')
# Contents of 'test2.json' file: {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat. Diese Funktion löst auch einen JSONPathError aus, wenn der angegebene JSON-Pfad ungültig ist (nicht existiert oder nicht darauf zugegriffen werden konnte).
JsonFileParser.append(json_path: str, append_value: any, append_at_end: bool = False) Diese Methode hängt einen Wert an ein vorhandenes JSON-Objekt an und gibt ein Python-Wörterbuch mit aktualisierten Inhalten zurück. Der Parameter json_path:str gibt einen Pfad an, zu dem neue Werte hinzugefügt werden. Um einen Wert an das Stammverzeichnis des JSON-Objekts anzuhängen, muss json_path gleich „$“ sein. append_value:any Parameter gibt einen Wert an, der angehängt wird. append_at_end:bool steuert das Verhalten dieser Funktion in Bezug auf JSON-Arrays von Objekten (Strukturen wie diese: [{}, {}, {}, ...]) und allgemeine Arrays (Strukturen wie diese: [a, b, c, . ..]). Es hat keinen Einfluss auf andere Strukturen. Wenn die Funktion auf „Falsch“ gesetzt ist, versucht sie, jedem Objekt eines Arrays einen bestimmten Wert hinzuzufügen. Wenn die Funktion auf „True“ gesetzt ist, versucht sie, den angegebenen Wert am Ende eines Arrays anzuhängen. (siehe Beispiele unten). Diese Funktion gibt ein Python-Wörterbuch mit aktualisiertem JSON zurück.
Diese Funktion löst eine IncorrectFunctionParameterTypeEroor -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst auch eine ValueError- Ausnahme aus, wenn „ Wert anhängen“ leer ist (entspricht einer leeren Zeichenfolge, einem leeren Array, einem leeren Wörterbuch usw.). Diese Funktion löst einen _JSONPathError aus , wenn der angegebene Pfad ungültig ist (nicht existiert oder nicht auf ihn zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Hinzufügen eines einfachen Schlüssel:Wert-Paares zum Stamm eines Objekts
from robust_json.file import JsonFileParser
op = JsonFileParser('test3.json')
# Contents of 'test3.json' file: {'test_key': 'test_value'}
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
Hinzufügen eines neuen Objekts zum Array von Objekten
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values have overwritten the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonFileParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
Hinzufügen eines Schlüssel-Wert-Paares zu jedem Objekt eines Arrays
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
Hinzufügen eines neuen Elements zu einem Array von Elementen:
from robust_json.file import JsonFileParser
op = JsonFileParser('test4.json')
# Contents of 'test4.json' file: {'colors': ['cyan', 'magenta']}
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened.
# That's because 'append_at_end' parameter is set to False.
# Function tried to append new string to each string and failed.
# To fix this, we need to set 'append_at_end' parameter to True.
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonFileParser.update_value(json_path: str, key_or_index: Union[str, int], new_value: any, strict_mode: bool = False)
Diese Funktion aktualisiert den Wert im Schlüssel:Wert-Paar und gibt ein Python-Wörterbuch mit aktualisiertem Inhalt zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar/Array/etc an. übergeordnetes Element, das aktualisiert werden muss. (Um den Wert im Stammverzeichnis des JSON-Objekts zu aktualisieren, muss json_path gleich „$“ sein), während der Parameter key_or_index:Union[str, int] den Schlüssel (wenn es sich um ein Objekt handelt) oder den Array-Index (wenn es sich um ein Array handelt) angibt. Dies bedeutet, dass, wenn wir den Schlüssel mit dem Pfad „field0.field1.upd key“ aktualisieren müssen, _json_path gleich „field0.field1“ und der Parameter key_or_index gleich „upd key“ ist. _Hinweis: Wenn Sie einen Array-Index verwenden, während der Parameter „json_path“ auf ein JSON-Objekt zeigt, oder wenn Sie einen Eigenschaftsnamen verwenden, während „json_path“ auf ein JSON-Array zeigt, wird eine Ausnahme ausgelöst (siehe Beispiele unten). new_value:any gibt einen Wert an, der den alten überschreibt, und strict_mode:bool aktiviert den Strict Mode. Standardmäßig ist dieser Modus deaktiviert. Wenn diese Methode aktiviert ist, stellt sie sicher, dass der neue Wert denselben Typ wie der alte hat (wenn der alte Wert eine Zeichenfolge ist, muss der neue Wert auch eine Zeichenfolge sein usw.). Wenn die Typen nicht übereinstimmen, wird eine Ausnahme ausgelöst.
Diese Funktion löst eine IncorrectFunctionParameterTypeError -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst außerdem einen JSONStrictModeError bei nicht übereinstimmenden Typen aus, wenn der Strict Mode aktiviert ist, und eine JSONPathError -Ausnahme, wenn der JSON-Pfad ungültig ist (nicht vorhanden oder nicht zugänglich). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Schlüssel:Wert-Paar im Stammverzeichnis des Objekts wird aktualisiert:
from robust_json.file import JsonFileParser
op = JsonFileParser('test5.json')
# Contents of 'test5.json' file: {'app_name': 'HomeCare', 'version', '1.0.0'}
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
Element in einem Array aktualisieren:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use
# 'get_item_index()' function from 'robust_json.ext' module to get it.
# (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
Wert mit striktem Modus aktualisieren:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'app_id': 1077}
op.update_value('$', 'app_id', 'this is a string', True)
# A 'StrictModeError' exception was raised.
# This happened because new value has a different type.
# Let's try again, but with integer.
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonFileParser.delete(json_path: str, key_or_index: Union[str, int]) Diese Funktion löscht ein Element aus JSON und gibt ein Python-Wörterbuch mit aktualisierten Inhalten zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar/Array/etc an. übergeordnetes Element, das gelöscht werden muss. (Um den Wert im Stammverzeichnis des JSON-Objekts zu löschen, muss json_path gleich „$“ sein), während der Parameter key_or_index:Union[str, int] den Schlüssel (wenn es sich um ein Objekt handelt) oder den Array-Index (wenn es sich um ein Array handelt) angibt. Dies bedeutet, dass, wenn wir den Schlüssel mit dem Pfad „field0.field1.del key“ löschen müssen, _json_path gleich „field0.field1“ und der Parameter key_or_index gleich „del key“ ist. _Hinweis: Wenn Sie einen Array-Index verwenden, während der Parameter „json_path“ auf ein JSON-Objekt zeigt, oder wenn Sie einen Eigenschaftsnamen verwenden, während „json_path“ auf ein JSON-Array zeigt, wird eine Ausnahme ausgelöst (siehe Beispiele unten). Diese Funktion löst eine IncorrectFunctionParameterTypeError -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst auch eine JSONPathError -Ausnahme aus, wenn der JSON-Pfad ungültig ist (nicht existiert oder nicht darauf zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Schlüssel:Wert-Paar im Stammverzeichnis des Objekts löschen:
from robust_json.file import JsonFileParser
op = JsonFileParser('test7.json')
# Contents of 'test5.json' file: {'test_key': 'test_val', 'del_key': 'del_val'}
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
Element in einem Array löschen:
from robust_json.file import JsonFileParser
op = JsonFileParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test9.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonFileParser.minify() Diese Funktion entfernt alle Einrückungen in der JSON-Datei. Grundsätzlich wird der gesamte JSON-Code in einer Zeile komprimiert.
Diese Funktion gibt keinen Wert zurück.
JsonFileParser.prettify(indent: int = 4) Diese Funktion fügt Einrückungen zu JSON in der Quelldatei hinzu, um die Lesbarkeit zu verbessern. Der Parameter indent:int gibt die Anzahl der Leerzeichen an. Standardmäßig ist es gleich 4. Diese Funktion ist das komplette Gegenteil von JsonFileParser.minify()
Diese Funktion gibt keinen Wert zurück.
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat.
JsonFileParser.reset(discard_active_object: bool = False) Diese Funktion setzt das aktive JSON-Objekt zurück und entfernt alle daran vorgenommenen Änderungen. Der Parameter „discard_active_object:bool“ steuert das Verhalten dieser Funktion in Bezug auf das aktive JSON-Objekt (Eigenschaft JsonFileParser.active_json). Wenn diese Methode auf „Falsch“ gesetzt ist, gibt sie einfach ein Anfangsobjekt zurück und behält alle Änderungen am aktuellen JSON bei. Wenn diese Funktion auf „True“ gesetzt ist, gibt sie immer noch das ursprüngliche Objekt zurück, setzt aber auch das aktive zurück und alle Änderungen werden endgültig gelöscht.
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat.
Beispiele:
Ein Anfangsobjekt abrufen und in einer Variablen speichern:
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use.
Ein anfängliches Objekt abrufen und ein aktives zurücksetzen:
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True.
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonFileParser.save_to_file(path: str = None, prettify: bool = True, create_file: bool = False) Diese Funktion speichert das aktive JSON-Objekt in einer Datei. Der Parameter path:str gibt den Pfad zur Datei an. Wenn es leer bleibt, wird das aktive Objekt in der Quelldatei gespeichert. Der Parameter prettify:bool ermöglicht Einrückungen. Standardmäßig ist es auf True gesetzt. Wenn es auf „Falsch“ gesetzt ist, wird JSON in eine Zeile komprimiert. Der Parameter „create_file:bool“ ermöglicht die Dateierstellung. Wenn diese Funktion auf „True“ gesetzt ist, erstellt sie eine neue Datei und speichert das aktive Objekt dort. Dies gilt jedoch nur, wenn der Pfadparameter auf eine nicht vorhandene Datei verweist. Hinweis: Wenn „create_file“ auf „True“ gesetzt ist und der Pfad auf eine vorhandene Datei zeigt, wird eine Ausnahme ausgelöst.
Diese Funktion löst einen JSONFileError aus, wenn die Enddatei JSON nicht unterstützt (eine nicht unterstützte Erweiterung hat). Diese Funktion löst einen FileExistsError aus, wenn create_file auf True gesetzt ist und die Datei bereits unter dem angegebenen Pfad existiert. Diese Funktion löst einen FileNotFoundError aus, wenn create_file auf False gesetzt ist und die Datei nicht unter dem angegebenen Pfad gefunden werden konnte. Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Aktives Objekt in der Quelldatei speichern:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file()
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling 'save_to_file' method without any arguments makes it
# overwrite an object in source file ('data.json' in this case)
# with the value of JsonFileParser.active_json property.
Aktives Objekt in einer anderen Datei (vorhanden) speichern:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonFileParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
Aktives Objekt in einer anderen Datei speichern (nicht vorhanden):
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonFileParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
Dieses Modul bietet verschiedene Methoden für die Arbeit mit JSON-Objekten direkt über die JsonObjectParser -Klasse. Diese Klasse wurde speziell für die Arbeit mit JSON entwickelt, das von API-Aufrufen empfangen oder in APIs verwendet werden soll. Um darauf zuzugreifen, importieren Sie einfach JsonObjectParser aus dem Dateimodul:
from robust_json.object import JsonObjectParser
und initialisiere es:
op = JsonObjectParser(json_obj)
Hinweis: JsonObjectParser unterstützt jetzt das automatische Speichern. Wenn aktiviert, speichert das Modul das aktive Objekt nach jeder daran vorgenommenen Änderung und schreibt es in die angegebene Datei.
Um das automatische Speichern zu aktivieren, initialisieren Sie einfach dieses Modul mit dem Parameter autosave
auf True
eingestellt:
op = JsonObjectParser(json_object, autosave=True)
Hinweis: Sie können auch eine Datei für den Autosaver angeben. Übergeben Sie bei der Initialisierung einfach den Parameter autosave_path
mit dem Pfad zu Ihrer Datei, etwa so:
op = JsonObjectParser(json_object, autosave=True, autosave_path=path_to_autosave_file)
Wenn die Datei nicht vorhanden ist, erstellt das Modul eine. Wenn eine Datei vorhanden ist, wird sie gekürzt und mit dem serialisierten aktiven Objekt gefüllt.
Während der Initialisierung kann eine IncorrectFunctionParameterTypeError -Ausnahme ausgelöst werden. Dies bedeutet, dass der JSON -Parameter einen falschen Typ hat.
Eigenschaften :
JsonObjectParser.active_json Diese Eigenschaft gibt ein JSON-Objekt mit allen letzten Änderungen zurück.
JsonObjectParser.backup Diese Eigenschaft gibt das ursprüngliche JSON-Objekt zurück und ignoriert alle letzten Änderungen. Diese beiden letzten Eigenschaften können verwirrend sein, daher hier ein Beispiel ( Hinweis: siehe entsprechenden Dokumentationsabschnitt für die Funktion JsonObjectParser.append() ):
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj) #Class initialization
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonObjectParser.backup property is equal to initial object.
# This is useful when there is a need to discard all changes to JSON object.
Methoden :
JsonObjectParser.get_key_value(json_path: str) Diese Methode greift auf einen Wert aus einem bestimmten Schlüssel:Wert-Paar im JSON-Objekt zu und gibt ihn zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar an (z. B. field0.field1.[...].fieldn). Beispiel:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
op = JsonObjectParser(obj)
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat. Diese Funktion löst auch einen JSONPathError aus, wenn der angegebene JSON-Pfad ungültig ist (nicht existiert oder nicht darauf zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
JsonObjectParser.append(json_path: str, append_value: any, append_at_end: bool = False) Diese Methode hängt einen Wert an ein vorhandenes JSON-Objekt an und gibt ein Python-Wörterbuch mit aktualisierten Inhalten zurück. Der Parameter json_path:str gibt einen Pfad an, zu dem neue Werte hinzugefügt werden. Um einen Wert an das Stammverzeichnis des JSON-Objekts anzuhängen, muss json_path gleich „$“ sein. append_value:any Parameter gibt einen Wert an, der angehängt wird. append_at_end:bool steuert das Verhalten dieser Funktion in Bezug auf JSON-Arrays von Objekten (Strukturen wie diese: [{}, {}, {}, ...]) und allgemeine Arrays (Strukturen wie diese: [a, b, c, . ..]). Es hat keinen Einfluss auf andere Strukturen. Wenn die Funktion auf „Falsch“ gesetzt ist, versucht sie, jedem Objekt eines Arrays einen bestimmten Wert hinzuzufügen. Wenn die Funktion auf „True“ gesetzt ist, versucht sie, den angegebenen Wert am Ende eines Arrays anzuhängen. (siehe Beispiele unten). Diese Funktion gibt ein Python-Wörterbuch mit aktualisiertem JSON zurück.
Diese Funktion löst eine IncorrectFunctionParameterTypeEroor -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst auch eine ValueError- Ausnahme aus, wenn „ Wert anhängen“ leer ist (leerer String, leeres Array, leeres Wörterbuch). Diese Funktion löst einen _JSONPathError aus , wenn der angegebene Pfad ungültig ist (nicht existiert oder nicht auf ihn zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Hinzufügen eines einfachen Schlüssel:Wert-Paares zum Stamm eines Objekts
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj)
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
Hinzufügen eines neuen Objekts zum Array von Objekten
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values overwrote the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonObjectParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
Hinzufügen eines Schlüssel-Wert-Paares zu jedem Objekt eines Arrays
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
Hinzufügen eines neuen Elements zu einem Array von Elementen:
from robust_json.object import JsonObjectParser
obj = {'colors': ['cyan', 'magenta']}
op = JsonObjectParser(obj)
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened
# That's because 'append_at_end' parameter is set to False
# Function tried to append new string to each string and failed
# To fix this, we need to set 'append_at_end' parameter to True
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonObjectParser.update_value(json_path: str, key_or_index: Union[str, int], new_value: any, strict_mode: bool = False)
Diese Funktion aktualisiert den Wert im Schlüssel:Wert-Paar und gibt ein Python-Wörterbuch mit aktualisiertem Inhalt zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar/Array/etc an. übergeordnetes Element, das aktualisiert werden muss. (Um den Wert im Stammverzeichnis des JSON-Objekts zu aktualisieren, muss json_path gleich „$“ sein), während der Parameter key_or_index:Union[str, int] den Schlüssel (wenn es sich um ein Objekt handelt) oder den Array-Index (wenn es sich um ein Array handelt) angibt. Dies bedeutet, dass, wenn wir den Schlüssel mit dem Pfad „field0.field1.upd key“ aktualisieren müssen, _json_path gleich „field0.field1“ und der Parameter key_or_index gleich „upd key“ ist. _Hinweis: Wenn Sie einen Array-Index verwenden, während der Parameter „json_path“ auf ein JSON-Objekt zeigt, oder wenn Sie einen Eigenschaftsnamen verwenden, während „json_path“ auf ein JSON-Array zeigt, wird eine Ausnahme ausgelöst (siehe Beispiele unten). new_value:any gibt einen Wert an, der den alten überschreibt, und strict_mode:bool aktiviert den Strict Mode. Standardmäßig ist dieser Modus deaktiviert. Wenn diese Methode aktiviert ist, stellt sie sicher, dass der neue Wert denselben Typ wie der alte hat (wenn der alte Wert eine Zeichenfolge ist, muss der neue Wert auch eine Zeichenfolge sein usw.). Wenn die Typen nicht übereinstimmen, wird eine Ausnahme ausgelöst.
Diese Funktion löst eine IncorrectFunctionParameterTypeError -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst bei nicht übereinstimmenden Typen auch einen JSONStrictModeError aus, wenn der strikte Modus aktiviert ist, und eine JSONPathError -Ausnahme, wenn der JSON-Pfad ungültig ist (nicht existiert oder nicht darauf zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Schlüssel:Wert-Paar im Stammverzeichnis des Objekts wird aktualisiert:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'version', '1.0.0'})
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
Element in einem Array aktualisieren:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
Wert mit striktem Modus aktualisieren:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'app_id': 1077})
op.update_value('$', 'app_id', 'this is a string', True)
# An 'StrictModeError' was raised
# This happened because new value has a different type
# Let's try again, but with integer
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonObjectParser.delete(json_path: str, key_or_index: Union[str, int]) Diese Funktion löscht ein Element aus JSON und gibt ein Python-Wörterbuch mit aktualisierten Inhalten zurück. Der Parameter json_path:str gibt einen Pfad zum Schlüssel:Wert-Paar/Array/etc an. übergeordnetes Element, das gelöscht werden muss. (Um den Wert im Stammverzeichnis des JSON-Objekts zu löschen, muss json_path gleich „$“ sein), während der Parameter key_or_index:Union[str, int] den Schlüssel (wenn es sich um ein Objekt handelt) oder den Array-Index (wenn es sich um ein Array handelt) angibt. Dies bedeutet, dass, wenn wir den Schlüssel mit dem Pfad „field0.field1.del key“ löschen müssen, _json_path gleich „field0.field1“ und der Parameter key_or_index gleich „del key“ ist. _Hinweis: Wenn Sie einen Array-Index verwenden, während der Parameter „json_path“ auf ein JSON-Objekt zeigt, oder wenn Sie einen Eigenschaftsnamen verwenden, während „json_path“ auf ein JSON-Array zeigt, wird eine Ausnahme ausgelöst (siehe Beispiele unten). Diese Funktion löst eine IncorrectFunctionParameterTypeError -Ausnahme aus, wenn ihre Parameter einen falschen Typ haben. Diese Funktion löst auch eine JSONPathError -Ausnahme aus, wenn der JSON-Pfad ungültig ist (nicht existiert oder nicht darauf zugegriffen werden konnte). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Schlüssel:Wert-Paar im Stammverzeichnis des Objekts löschen:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_val', 'del_key': 'del_val'}
op = JsonObjectParser(obj)
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
Element in einem Array löschen:
from robust_json.object import JsonObjectParser
op = JsonObjectParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
obj = {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op = JsonObjectParser(obj)
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonObjectParser.reset(discard_active_object: bool = False) Diese Funktion setzt das aktive JSON-Objekt zurück und entfernt alle daran vorgenommenen Änderungen. Der Parameter „discard_active_object:bool“ steuert das Verhalten dieser Funktion in Bezug auf das aktive JSON-Objekt (Eigenschaft JsonObjectParser.active_json). Wenn diese Methode auf „Falsch“ gesetzt ist, gibt sie einfach ein Anfangsobjekt zurück und behält alle Änderungen am aktuellen JSON bei. Wenn diese Funktion auf „True“ gesetzt ist, gibt sie immer noch das ursprüngliche Objekt zurück, setzt aber auch das aktive zurück und alle Änderungen werden endgültig gelöscht.
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat. Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Ein Anfangsobjekt abrufen und in einer Variablen speichern:
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use
Ein anfängliches Objekt abrufen und ein aktives zurücksetzen:
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonObjectParser.save_to_file(path: str, prettify: bool = True, create_file: bool = False) Diese Funktion speichert das aktive JSON-Objekt in einer Datei. Der Parameter path:str gibt den Pfad zur Datei an. Der Parameter prettify:bool ermöglicht Einrückungen. Standardmäßig ist es auf True gesetzt. Wenn es auf „Falsch“ gesetzt ist, wird JSON in eine Zeile komprimiert. Der Parameter „create_file:bool“ ermöglicht die Dateierstellung. Wenn diese Funktion auf „True“ gesetzt ist, erstellt sie eine neue Datei und speichert das aktive Objekt dort. Dies gilt jedoch nur, wenn der Pfadparameter auf eine nicht vorhandene Datei verweist. Hinweis: Wenn „create_file“ auf „True“ gesetzt ist und der Pfad auf eine vorhandene Datei zeigt, wird eine Ausnahme ausgelöst.
Diese Funktion löst einen JSONFileError aus, wenn die Enddatei JSON nicht unterstützt (eine nicht unterstützte Erweiterung hat). Diese Funktion löst einen FileExistsError aus, wenn „cheate_file“ auf „True“ gesetzt ist und die Datei bereits unter dem angegebenen Pfad existiert. Diese Funktion löst einen FileNotFoundError aus, wenn create_file auf False gesetzt ist und die Datei nicht unter dem angegebenen Pfad gefunden werden konnte. Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiele:
Aktives Objekt in einer Datei speichern (vorhanden):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonObjectParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
Aktives Objekt in einer Datei speichern (nicht vorhanden):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonObjectParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
Dieses Modul enthält alle benutzerdefinierten Ausnahmen, die während der Paketlaufzeit ausgelöst werden können. Es gibt insgesamt 5: JSONFileError , JSONPathError , JSONStrictModeError , JSONObjectError , IncorrectFunctionParameterTypeError . Wenn Sie sie importieren müssen, können Sie dies wie folgt tun:
import robust_json.errors as json_err
filter_json_array(json_array: Liste, Feld: Zeichenfolge, Wert: beliebig) Diese Funktion filtert ein bestimmtes Array von JSON-Objekten und gibt es zurück. Der Parameter json_array:list gibt die Liste an, die gefiltert werden muss, field:str gibt den Schlüssel an und value:any gibt den Wert an. Die beiden letzten Parameter bilden ein Schlüssel-Wert-Paar, das die Rolle eines Filters übernimmt.
Diese Funktion gibt eine Liste mit gefiltertem Inhalt zurück.
Diese Funktion löst eine IncorrectFunctionParameterTypeError -Ausnahme aus, wenn einer oder mehrere ihrer Parameter einen falschen Typ haben. Diese Funktion löst einen JSONObjectError aus, wenn json_arr kein Array von Objekten ist ([{}, {}, {}, ...]). Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiel: Filtern eines Arrays von Objekten nach einem bestimmten Schlüssel:Wert-Paar
from robust_json.ext import filter_json_array
orders = [{"order_id":1648,"country":"USA" },{"order_id":1830,"country":"Liberia"},
{"order_id":6703,"country":"USA"},{"order_id":2995,"country":"Russia"}]
usa_orders = filter_json_array(orders, 'country', 'USA')
print(usa_orders)
# Output: [{"order_id":1648,"country":"USA" }, {"order_id":6703,"country":"USA"}]
get_item_index(item: any, array: list, Always_array: bool = False) Diese Funktion findet ein Intem in einem bestimmten Array und gibt dessen Index(e) zurück. item:any gibt das Element an, dessen Index gefunden werden muss. array:list gibt das Array an, in dem dieses Element vorhanden sein muss, und Always_array:bool steuert den Rückgabetyp dieser Funktion. Wenn diese Funktion auf „Falsch“ gesetzt ist, gibt sie bei mehreren Übereinstimmungen ein Array zurück, bei nur einer Übereinstimmung jedoch eine Ganzzahl. Wenn diese Funktion auf True gesetzt ist, gibt sie immer ein Array zurück (siehe Beispiele unten).
Beispiele:
from robust_json.ext import get_item_index
arr1 = [1, 2, 3, 4]
index = get_item_index(2, arr1, False)
print(index)
# Output: 1
# Note: we set 'always_array' parameter to False, therefore function returned an integer
arr2 = [5, 9, 10, 45, 555]
index = get_item_index(10, arr2, True)
print(index)
# Output: [2]
# Note: we set 'always_array' parameter to True, therefore function returned an array even if there
# is only one match. This is useful when this array will be iterated later on.
arr3 = [1, 6, 'string', 8, 5, 4, 'string', 0, 22]
index = get_item_index('string', arr3, False)
# Note: even if 'alway_array' parameter set to False, this function will return an array of
# integers because there are multiple matches
print(index)
# Output: [2, 6]
arr4 = [1, 2, 3]
index = get_item_index(6, arr4, False)
# Note: if item is not present in the array and 'always_array' parameter set to False,
# None will be returned.
print(index)
# Output: None
arr5 = [5, 6, 7]
index = get_item_index(10, arr5, True)
# Note: if item is not present in the array and 'always_array' parameter set to True,
# an empty array will be returned.
print(index)
# Output: []
reverse_array(array: list) Diese Funktion kehrt ein Array um und gibt es zurück.
Diese Funktion löst einen IncorrectFunctionParameterTypeError aus, wenn ihr Parameter einen falschen Typ hat. Diese Funktion löst gegebenenfalls weitere Ausnahmen aus.
Beispiel:
from robust_json.ext import reverse_array
arr = ['a', 'b', 'c']
rev_arr = reverse_array(arr)
print(rev_arr)
# Output: ['c', 'b', 'a']