Eine einfache Lösung für ein Header für das Parsen von JSON in C und C ++.
JSON wird in einen schreibgeschützten Puffer mit einer einzelnen Allokation analysiert.
Die derzeit unterstützten Compiler sind GCC, Clang und MSVC.
Die aktuellen unterstützten Plattformen sind Windows, Mac OS und Linux.
Nur #include "json.h" in Ihrem Code!
Analysieren Sie eine JSON -String in eine DOM.
struct json_value_s * json_parse (
const void * src ,
size_t src_size );src - Ein UTF -8 JSON -String, der analysiert wird.src_size - Die Größe von src in Bytes. Gibt eine struct json_value_s* zeigt die Wurzel des JSON -Doms.
Die Hauptstruktur für die Interaktion mit einem analysierten JSON -Dokumentobjektmodell (DOM) ist die struct json_value_s .
struct json_value_s {
void * payload ;
size_t type ;
};payload - Ein Zeiger auf den Inhalt des Wertes.type - die Art der payload zeigt auf einen von json_type_e . HINWEIS: Wenn der Typ json_type_true , json_type_false oder json_type_null ist, ist die Nutzlast null.Erweiterte eine JSON -String in eine DOM.
struct json_value_s * json_parse_ex (
const void * src ,
size_t src_size ,
size_t flags_bitset ,
void * ( * alloc_func_ptr )( void * , size_t ),
void * user_data ,
struct json_parse_result_s * result );src - Ein UTF -8 JSON -String, der analysiert wird.src_size - Die Größe von src in Bytes.flags_bitset - zusätzliche Parsing -Flags, eine Bitset von Flags, die in enum json_parse_flags_e angegeben sind.alloc_func_ptr - Eine Rückruffunktion, die zur Durchführung der einzelnen Zuordnung verwendet werden soll. Wenn null, wird malloc() verwendet.user_data - Benutzerdaten, die als erstes Argument an alloc_func_ptr übergeben werden sollen.result - Das Ergebnis der Parsen. Wenn ein Parsenfehler aufgetreten ist, enthält dies die Art von Fehler und wo in der Quelle er aufgetreten ist. Kann null sein. Gibt eine struct json_value_s* zeigt die Wurzel des JSON -Doms.
Die zusätzlichen Parsing -Flags, die für json_parse_ex() angegeben werden können, sind wie folgt:
enum json_parse_flags_e {
json_parse_flags_default = 0 ,
json_parse_flags_allow_trailing_comma = 0x1 ,
json_parse_flags_allow_unquoted_keys = 0x2 ,
json_parse_flags_allow_global_object = 0x4 ,
json_parse_flags_allow_equals_in_object = 0x8 ,
json_parse_flags_allow_no_commas = 0x10 ,
json_parse_flags_allow_c_style_comments = 0x20 ,
json_parse_flags_deprecated = 0x40 ,
json_parse_flags_allow_location_information = 0x80 ,
json_parse_flags_allow_single_quoted_strings = 0x100 ,
json_parse_flags_allow_hexadecimal_numbers = 0x200 ,
json_parse_flags_allow_leading_plus_sign = 0x400 ,
json_parse_flags_allow_leading_or_trailing_decimal_point = 0x800 ,
json_parse_flags_allow_inf_and_nan = 0x1000 ,
json_parse_flags_allow_multi_line_strings = 0x2000 ,
json_parse_flags_allow_simplified_json =
( json_parse_flags_allow_trailing_comma |
json_parse_flags_allow_unquoted_keys |
json_parse_flags_allow_global_object |
json_parse_flags_allow_equals_in_object |
json_parse_flags_allow_no_commas ),
json_parse_flags_allow_json5 =
( json_parse_flags_allow_trailing_comma |
json_parse_flags_allow_unquoted_keys |
json_parse_flags_allow_c_style_comments |
json_parse_flags_allow_single_quoted_strings |
json_parse_flags_allow_hexadecimal_numbers |
json_parse_flags_allow_leading_plus_sign |
json_parse_flags_allow_leading_or_trailing_decimal_point |
json_parse_flags_allow_inf_and_nan |
json_parse_flags_allow_multi_line_strings )
};json_parse_flags_default - Die Standardeinstellung ist kein spezielles Verhalten aktiviert.json_parse_flags_allow_trailing_comma - Ermöglichen Sie Nachverfolgung in Objekten und Arrays. Zum Beispiel wären sowohl [true,] als auch {"a" : null,} mit dieser Option auf zulässig.json_parse_flags_allow_unquoted_keys - Ermöglichen Sie nicht zahlreiche Schlüssel für Objekte. Zum Beispiel wäre {a : null} mit dieser Option auf zulässig.json_parse_flags_allow_global_object - Ermöglichen Sie ein globales ungebrochenes Objekt. Zum Beispiel wäre a : null, b : true, c : {} mit dieser Option auf.json_parse_flags_allow_equals_in_object - Erlauben Sie Objekte, '=' sowie ':' zwischen Schlüssel-/Wertpaaren zu verwenden. Zum Beispiel wäre {"a" = null, "b" : true} mit dieser Option auf zulässig.json_parse_flags_allow_no_commas - Erlauben Sie, dass Objekte keine Komma -Separatoren zwischen Schlüssel-/Wertpaaren haben müssen. Zum Beispiel wäre {"a" : null "b" : true} mit dieser Option auf zulässig.json_parse_flags_allow_c_style_comments - Ermöglichen Sie, dass Kommentare ( // oder /* */ ) in der Eingabe -JSON -Datei ignoriert werden.json_parse_flags_deprecated - Eine veraltete Option.json_parse_flags_allow_location_information - Ermöglichen Sie die Verfolgung von Standortinformationen für den Punkt, an dem sich die Werte im Eingabe -JSON befinden. Nützlich, um Benutzer auf Fehler mit präzisen Standortinformationen in Bezug auf die ursprüngliche Quelle aufmerksam zu machen. Wenn diese Option aktiviert ist, können alle json_value_s* -S -S an json_value_ex_s* gegossen werden, und das Name json_string_s* von json_object_element_s* 'S -Namensmitglied kann an json_string_ex_s* gegossen werden, um spezifische Lebende auf allen Werten und Keys abzurufen. Beachten Sie, dass diese Option das für das DOM erforderliche Speicherbudget erhöht, das zum Aufzeichnen des JSON verwendet wird.json_parse_flags_allow_single_quoted_strings - Ermöglicht die Zeichenfolgen in 'single quotes' .json_parse_flags_allow_hexadecimal_numbers - Ermöglicht die Verwendung von Hexadezimalnummern 0x42 .json_parse_flags_allow_leading_plus_sign - Ermöglicht ein Leading ' +' Zeichen für Zahlen +42 .json_parse_flags_allow_leading_or_trailing_decimal_point - Ermöglicht die Dezimalpunkte von 0 Ziffern .42 oder 42. .json_parse_flags_allow_inf_and_nan - Ermöglicht die Verwendung von Infinity- und NAN -Kennern Infinity oder NaN .json_parse_flags_allow_multi_line_strings - Ermöglicht die Saiten mehrere Zeilen.json_parse_flags_allow_simplified_json - Ermöglichen Sie, dass die vereinfachte JSON analysiert wird. Simplified JSON ist eine Reihe anderer Parsing -Optionen zur Verfügung. Siehe den Bitsquid -Blog, um dies hier vorzustellen.json_parse_flags_allow_json5 - Ermöglichen Sie, dass JSON5 analysiert wird. JSON5 ist eine Reihe anderer Parsingoptionen. Siehe die Website, die diese Erweiterung hier definiert. json_parseNehmen wir an, wir hatten die JSON -String '{"a": wahr, "B": [Falsch, Null, "foo"]}' . Um jeden Teil des analysierten JSON zu erreichen, das wir tun würden:
const char json [] = "{"a" : true, "b" : [false, null, "foo"]}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
assert ( root -> type == json_type_object );
struct json_object_s * object = ( struct json_object_s * ) root -> payload ;
assert ( object -> length == 2 );
struct json_object_element_s * a = object -> start ;
struct json_string_s * a_name = a -> name ;
assert ( 0 == strcmp ( a_name -> string , "a" ));
assert ( a_name -> string_size == strlen ( "a" ));
struct json_value_s * a_value = a -> value ;
assert ( a_value -> type == json_type_true );
assert ( a_value -> payload == NULL );
struct json_object_element_s * b = a -> next ;
assert ( b -> next == NULL );
struct json_string_s * b_name = b -> name ;
assert ( 0 == strcmp ( b_name -> string , "b" ));
assert ( b_name -> string_size == strlen ( "b" ));
struct json_value_s * b_value = b -> value ;
assert ( b_value -> type == json_type_array );
struct json_array_s * array = ( struct json_array_s * ) b_value -> payload ;
assert ( array -> length == 3 );
struct json_array_element_s * b_1st = array -> start ;
struct json_value_s * b_1st_value = b_1st -> value ;
assert ( b_1st_value -> type == json_type_false );
assert ( b_1st_value -> payload == NULL );
struct json_array_element_s * b_2nd = b_1st -> next ;
struct json_value_s * b_2nd_value = b_2nd -> value ;
assert ( b_2nd_value -> type == json_type_null );
assert ( b_2nd_value -> payload == NULL );
struct json_array_element_s * b_3rd = b_2nd -> next ;
assert ( b_3rd -> next == NULL );
struct json_value_s * b_3rd_value = b_3rd -> value ;
assert ( b_3rd_value -> type == json_type_string );
struct json_string_s * string = ( struct json_string_s * ) b_3rd_value -> payload ;
assert ( 0 == strcmp ( string -> string , "foo" ));
assert ( string -> string_size == strlen ( "foo" ));
/* Don't forget to free the one allocation! */
free ( root );Es gibt einige Funktionen, die keinen anderen Zweck erfüllen, als es schöner zu machen, durch den produzierten JSON DOM zu iterieren:
json_value_as_string - Gibt einen Wert als Zeichenfolge oder NULL zurück, wenn es keine Zeichenfolge war.json_value_as_number - Gibt einen Wert als Nummer oder NULL zurück, wenn es keine Nummer war.json_value_as_object - Gibt einen Wert als Objekt zurück oder null, wenn es kein Objekt war.json_value_as_array - Gibt einen Wert als Array oder Null zurück, wenn es kein Array war.json_value_is_true - Rücksende ungleich Null ist ein Wert, der true, sonst Null.json_value_is_false - returns non-zero is a value was false, zero otherwise.json_value_is_null - Rücksende ungleich Null ist ein Wert, der null war, sonst Null.Schauen wir uns das gleiche Beispiel von oben an, verwenden aber stattdessen diese Helfer -Iteratoren:
const char json [] = "{"a" : true, "b" : [false, null, "foo"]}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
struct json_object_s * object = json_value_as_object ( root );
assert ( object != NULL );
assert ( object -> length == 2 );
struct json_object_element_s * a = object -> start ;
struct json_string_s * a_name = a -> name ;
assert ( 0 == strcmp ( a_name -> string , "a" ));
assert ( a_name -> string_size == strlen ( "a" ));
struct json_value_s * a_value = a -> value ;
assert ( json_value_is_true ( a_value ));
struct json_object_element_s * b = a -> next ;
assert ( b -> next == NULL );
struct json_string_s * b_name = b -> name ;
assert ( 0 == strcmp ( b_name -> string , "b" ));
assert ( b_name -> string_size == strlen ( "b" ));
struct json_array_s * array = json_value_as_array ( b -> value );
assert ( array -> length == 3 );
struct json_array_element_s * b_1st = array -> start ;
struct json_value_s * b_1st_value = b_1st -> value ;
assert ( json_value_is_false ( b_1st_value ));
struct json_array_element_s * b_2nd = b_1st -> next ;
struct json_value_s * b_2nd_value = b_2nd -> value ;
assert ( json_value_is_null ( b_2nd_value ));
struct json_array_element_s * b_3rd = b_2nd -> next ;
assert ( b_3rd -> next == NULL );
struct json_string_s * string = json_value_as_string ( b_3rd -> value );
assert ( string != NULL );
assert ( 0 == strcmp ( string -> string , "foo" ));
assert ( string -> string_size == strlen ( "foo" ));
/* Don't forget to free the one allocation! */
free ( root );Wie Sie sehen können, macht es die Iterie durch den Dom etwas angenehmer.
Wenn Sie einen Wert aus einem DOM in eine neue Zuordnung extrahieren möchten, sind Sie Freunde von json_extract_value und json_extract_value_ex . Mit diesen Funktionen können Sie einen beliebigen Wert und seinen Subtree von einem DOM nehmen und in eine neue Zuordnung klonen - entweder eine einzelne malloc oder eine von Benutzer bereitgestellte Zuordnungsregion.
const char json [] = "{"foo" : { "bar" : [123, false, null, true], "haz" : "haha" }}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
assert ( root );
struct json_value_s * foo = json_value_as_object ( root ) -> start -> value ;
assert ( foo );
struct json_value_s * extracted = json_extract_value ( foo );
/* We can free root now because we've got a new allocation for extracted! */
free ( root );
assert ( json_value_as_object ( extracted ));
/* Don't forget to free the one allocation! */
free ( extracted );Die JSON_PARSE -Funktion ruft Malloc einmal auf und schneidet dann diese einzelne Zuordnung auf, um alle seltsamen und wunderbaren JSON -Strukturen zu unterstützen, die Sie sich vorstellen können!
Die Struktur der Daten ist immer die JSON -Strukturen zuerst (die die Struktur des ursprünglichen JSON codieren), gefolgt von den Daten.
Dies ist eine kostenlose und nicht belastete Software, die öffentlich veröffentlicht wurde.
Jeder kann diese Software kostenlos kopieren, ändern, veröffentlichen, verwenden, kompilieren, verkaufen oder verteilen, entweder in Quellcodeform oder als kompilierter binär, für jeden Zweck, kommerziell oder nicht kommerziell und auf jeden Fall.
In Gerichtsbarkeiten, die Urheberrechtsgesetze anerkennen, widmen der Autor oder die Autoren dieser Software alle Urheberrechtsinteresse an der Software für öffentliche Domäne. Wir machen dieses Engagement zum Nutzen der Öffentlichkeit im Allgemeinen und zum Nachteil unserer Erben und Nachfolger. Wir beabsichtigen, dass dieses Engagement ein offener Akt der Aufgabe über die Dauer aller gegenwärtigen und zukünftigen Rechte dieser Software nach dem Urheberrecht ist.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall haftet die Autoren für Ansprüche, Schäden oder eine andere Haftung, sei es in Vertragsmaßnahmen, unerlaubter Handlung oder auf andere Weise, aus oder im Zusammenhang mit der Software oder der Verwendung oder anderen Geschäften in der Software.
Weitere Informationen finden Sie unter http://unlicense.org/