CおよびC ++でJSONを解析するためのシンプルなシングルヘッダーソリューション。
JSONは、読み取り専用の単一割り当てバッファーに解析されます。
現在のサポートされているコンパイラは、GCC、Clang、MSVCです。
現在サポートされているプラットフォームは、Windows、Mac OS、Linuxです。
あなたのコードに#include "json.h" !
JSON文字列をDOMに解析します。
struct json_value_s * json_parse (
const void * src ,
size_t src_size );src解析するUTF -8 JSON文字列。src_sizeバイト単位のsrcのサイズ。 json domのルートを指すstruct json_value_s*を返します。
解析されたJSONドキュメントオブジェクトモデル(DOM)と対話するための主要な構造はstruct json_value_sです。
struct json_value_s {
void * payload ;
size_t type ;
};payload - 値の内容へのポインター。type - json_type_eの1つのstruct payloadポイントのタイプ。注:タイプがjson_type_true 、 json_type_false 、またはjson_type_nullの場合、ペイロードはnullになります。JSON文字列を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解析するUTF -8 JSON文字列。src_sizeバイト単位のsrcのサイズ。flags_bitset enum json_parse_flags_eで指定されたフラグのビットセット。alloc_func_ptr単一の割り当てを実行するために使用するコールバック関数。 nullの場合、 malloc()が使用されます。user_data alloc_func_ptrの最初の引数として渡されるユーザーデータ。result - 解析の結果。解析エラーが発生した場合、これにはどのタイプのエラーが含まれ、どこで発生したかが含まれます。 nullにすることができます。 json domのルートを指すstruct json_value_s*を返します。
json_parse_ex()に指定できる追加の解析フラグは次のとおりです。
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デフォルト、特別な動作は有効になりません。json_parse_flags_allow_trailing_commaオブジェクトと配列のトレーリングコンマを許可します。たとえば、 [true,]と{"a" : null,}の両方が、このオプションをオンにすると許可されます。json_parse_flags_allow_unquoted_keysオブジェクトに引用されていないキーを許可します。たとえば、 {a : null}このオプションをオンにすると許可されます。json_parse_flags_allow_global_objectグローバルUnbracketedオブジェクトを許可します。たとえば、 a : null, b : true, c : {}このオプションをオンにすると許可されます。json_parse_flags_allow_equals_in_objectオブジェクトが '='および ':'を使用してキー/値のペアを使用します。たとえば、 {"a" = null, "b" : true}このオプションをオンにすると許可されます。json_parse_flags_allow_no_commasキー/値のペアの間にコンマセパレーターを持たないでください。たとえば、 {"a" : null "b" : true}このオプションをオンにすると許可されます。json_parse_flags_allow_c_style_comments入力JSONファイルでCスタイルのコメント( //または/* */ )を無視することを許可します。json_parse_flags_deprecated非推奨オプション。json_parse_flags_allow_location_information入力JSON内の値がどこにあるかについて、位置情報を追跡することを許可します。元のソースに関する正確な位置情報を使用してユーザーにエラーを警告するのに役立ちます。このオプションが有効になっている場合、すべてのjson_value_s*のsはjson_value_ex_s*にキャストでき、 json_object_element_s*のjson_string_s* *の名前メンバーはjson_string_ex_s*にキャストして、すべての値とキーの特定の位置を取得できます。注このオプションは、JSONの記録に使用されるDOMに必要なメモリ予算を増やします。json_parse_flags_allow_single_quoted_strings文字列が'single quotes'にあることを許可します。json_parse_flags_allow_hexadecimal_numbersヘキサデシマル数を使用することを許可します0x42 。json_parse_flags_allow_leading_plus_sign -LIEDING ' +' Sign on Numbers +42を許可します。json_parse_flags_allow_leading_or_trailing_decimal_point .42桁または42.で小数点をリードまたはトレイルすることを許可します。json_parse_flags_allow_inf_and_nan -InfinityおよびNAN Identifiers InfinityまたはNaNを使用できます。json_parse_flags_allow_multi_line_strings文字列が複数の行にまたがることができます。json_parse_flags_allow_simplified_json単純化されたJSONを解析することを許可します。簡素化されたJSONは、他の一連の解析オプションを有効にすることです。これを紹介するBitsquidブログをご覧ください。json_parse_flags_allow_json5 -JSON5を解析することを許可します。 JSON5は、他の一連の解析オプションを有効にすることです。ここでこの拡張機能を定義するウェブサイトを参照してください。 json_parseとの解析json string '{"a":true、 "b":[false、null、 "foo"]}'を持っていたとしましょう。解析されたJSONの各部分に到達するには:
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 );生産されたJSON DOMを介して反復すること以外に目的を果たさない関数がいくつかあります。
json_value_as_string値を文字列として返す、または文字列ではない場合はnullを返します。json_value_as_number値を数字として返す、または数字ではない場合はnullを返します。json_value_as_objectオブジェクトとして値を返すか、オブジェクトではない場合はnullを返します。json_value_as_arrayアレイとして値を返し、アレイでない場合はnullを返します。json_value_is_true -returns非ゼロは値が真で、それ以外の場合はゼロでした。json_value_is_false -returns非ゼロは値がfalseで、それ以外の場合はゼロでした。json_value_is_null -returns非ゼロは値がnullで、それ以外の場合はゼロでした。上記の同じ例を見てみましょうが、代わりにこれらのヘルパーイテレーターを使用してください。
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 );ご覧のとおり、ドムを介してもう少し快適になります。
domから値を新しい割り当てに抽出する場合は、 json_extract_valueとjson_extract_value_exは友達ですか。これらの関数により、任意の値とそのサブツリーをDOMから取得し、単一のmallocまたはユーザーが提供する割り当て領域のいずれかを新しい割り当てにクローン化できます。
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 );JSON_PARSE関数はMALLOCを1回呼び出し、この単一の割り当てをスライスして、想像できる奇妙で素晴らしいJSON構造をすべてサポートします!
データの構造は、常にJSON構造体(元のJSONの構造をエンコード)で、その後にデータが続きます。
これは、パブリックドメインにリリースされた無料で邪魔されていないソフトウェアです。
誰でも、このソフトウェアがソースコード形式またはコンパイルされたバイナリとして、あらゆる目的、商業的または非営利的なものとして、およびあらゆる手段で、このソフトウェアを自由にコピー、変更、公開、使用、コンパイル、販売、または配布することができます。
著作権法を認識する管轄区域では、このソフトウェアの著者または著者は、ソフトウェアに対するすべての著作権の関心をパブリックドメインに捧げます。私たちは、この献身を大衆の利益のために、そして私たちの相続人と後継者を損なうために献身します。私たちは、この献身は、著作権法に基づくこのソフトウェアに対するすべての現在および将来の権利の永続性における放棄の明白な行為であることを意図しています。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なものを保証することなく、「現状のまま」提供されます。いかなる場合でも、著者は、契約、不法行為、またはその他の訴訟、ソフトウェア、またはソフトウェアの使用またはその他の取引に関連する、またはその他の契約の措置、またはその他の請求、損害、またはその他の責任について責任を負いません。
詳細については、http://unlicense.org/を参照してください。