Solusi header tunggal sederhana untuk parsing JSON di C dan C ++.
JSON diuraikan menjadi buffer alokasi tunggal yang hanya membaca.
Kompiler yang didukung saat ini adalah GCC, Clang dan MSVC.
Platform yang didukung saat ini adalah Windows, Mac OS dan Linux.
Just #include "json.h" di kode Anda!
Parse string JSON ke dalam DOM.
struct json_value_s * json_parse (
const void * src ,
size_t src_size );src - string JSON UTF -8 untuk diurai.src_size - Ukuran src dalam byte. Mengembalikan struct json_value_s* mengarahkan akar JSON DOM.
Struct utama untuk berinteraksi dengan model objek dokumen JSON yang diuraikan (DOM) adalah struct json_value_s .
struct json_value_s {
void * payload ;
size_t type ;
};payload - Pointer ke konten nilai.type - Jenis poin payload struct ke, salah satu dari json_type_e . Catatan: Jika tipe adalah json_type_true , json_type_false , atau json_type_null , payload akan menjadi nol.Extended Parse A JSON String ke dalam 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 - string JSON UTF -8 untuk diurai.src_size - Ukuran src dalam byte.flags_bitset - Bendera parsing ekstra, bitset bendera yang ditentukan dalam enum json_parse_flags_e .alloc_func_ptr - fungsi panggilan balik untuk digunakan untuk melakukan alokasi tunggal. Jika null, malloc() digunakan.user_data - Data pengguna disahkan sebagai argumen pertama ke alloc_func_ptr .result - Hasil parsing. Jika terjadi kesalahan parsing, ini akan berisi jenis kesalahan apa, dan di mana sumber itu terjadi. Bisa nol. Mengembalikan struct json_value_s* mengarahkan akar JSON DOM.
Bendera parsing ekstra yang dapat ditentukan untuk json_parse_ex() adalah sebagai berikut:
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 - default, tidak ada perilaku khusus yang diaktifkan.json_parse_flags_allow_trailing_comma - Izinkan koma trailing di objek dan array. Misalnya, baik [true,] dan {"a" : null,} akan diizinkan dengan opsi ini di.json_parse_flags_allow_unquoted_keys - Izinkan kunci yang tidak dikutip untuk objek. Misalnya, {a : null} akan diizinkan dengan opsi ini di.json_parse_flags_allow_global_object - memungkinkan objek global yang tidak terkutuk. Misalnya, a : null, b : true, c : {} akan diizinkan dengan opsi ini di.json_parse_flags_allow_equals_in_object - Izinkan objek untuk digunakan '=' serta ':' antara pasangan kunci/nilai. Misalnya, {"a" = null, "b" : true} akan diizinkan dengan opsi ini di.json_parse_flags_allow_no_commas - Izinkan objek itu tidak harus memiliki pemisah koma antara pasangan kunci/nilai. Misalnya, {"a" : null "b" : true} akan diizinkan dengan opsi ini di.json_parse_flags_allow_c_style_comments - Izinkan komentar c -style ( // atau /* */ ) diabaikan dalam file input JSON.json_parse_flags_deprecated - opsi yang sudah usang.json_parse_flags_allow_location_information - Izinkan informasi lokasi dilacak di mana nilai -nilai dalam input JSON. Berguna untuk memperingatkan pengguna untuk kesalahan dengan informasi lokasi yang tepat yang berkaitan dengan sumber asli. Ketika opsi ini diaktifkan, semua json_value_s* dapat dilemparkan ke json_value_ex_s* , dan json_string_s* dari json_object_element_s* nama nama dapat dilemparkan ke json_string_ex_s* untuk mengambil lokasi spesifik pada semua nilai dan Keys. Catatan Opsi ini akan meningkatkan anggaran memori yang diperlukan untuk DOM yang digunakan untuk merekam JSON.json_parse_flags_allow_single_quoted_strings - Memungkinkan string berada di 'single quotes' .json_parse_flags_allow_hexadecimal_numbers - Memungkinkan angka heksadesimal untuk digunakan 0x42 .json_parse_flags_allow_leading_plus_sign - Memungkinkan tanda ' +' yang terkemuka pada angka +42 .json_parse_flags_allow_leading_or_trailing_decimal_point - Memungkinkan titik desimal untuk dipimpin atau dibuntuti oleh 0 digit .42 atau 42. .json_parse_flags_allow_inf_and_nan - memungkinkan penggunaan infinity dan pengidentifikasi NAN Infinity atau NaN .json_parse_flags_allow_multi_line_strings - memungkinkan string untuk menjangkau beberapa baris.json_parse_flags_allow_simplified_json - Izinkan JSON yang disederhanakan diuraikan. JSON yang disederhanakan adalah memungkinkan serangkaian opsi penguraian lainnya. Lihat blog Bitsquid yang memperkenalkan ini di sini.json_parse_flags_allow_json5 - Izinkan JSON5 diuraikan. JSON5 adalah pengaktifan serangkaian opsi penguraian lainnya. Lihat situs web yang mendefinisikan ekstensi ini di sini. json_parseKatakanlah kita memiliki string json '{"a": true, "b": [false, null, "foo"]}' . Untuk sampai ke setiap bagian dari JSON yang diuraikan yang akan kami lakukan:
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 );Ada beberapa fungsi yang tidak memiliki tujuan selain untuk membuatnya lebih baik untuk mengulangi melalui JSON DOM yang diproduksi:
json_value_as_string - Mengembalikan nilai sebagai string, atau null jika itu bukan string.json_value_as_number - Mengembalikan nilai sebagai angka, atau nol jika itu bukan angka.json_value_as_object - Mengembalikan nilai sebagai objek, atau nol jika itu bukan objek.json_value_as_array - Mengembalikan nilai sebagai array, atau nol jika itu bukan array.json_value_is_true - Mengembalikan nol adalah nilai itu benar, nol sebaliknya.json_value_is_false - pengembalian non -nol adalah nilai yang salah, nol sebaliknya.json_value_is_null - Mengembalikan nol adalah nilai adalah nol, nol sebaliknya.Mari kita lihat contoh yang sama dari atas tetapi menggunakan iterator helper ini sebagai gantinya:
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 );Seperti yang Anda lihat itu membuat iterasi melalui DOM sedikit lebih menyenangkan.
Jika Anda ingin mengekstrak nilai dari DOM ke alokasi baru maka json_extract_value dan json_extract_value_ex apakah Anda berteman. Fungsi -fungsi ini memungkinkan Anda mengambil nilai apa pun dan subtree -nya dari DOM dan mengkloningnya menjadi alokasi baru - baik malloc tunggal atau wilayah alokasi yang disediakan pengguna.
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 );Fungsi JSON_PARSE memanggil Malloc sekali, dan kemudian mengiris alokasi tunggal ini untuk mendukung semua struktur JSON yang aneh dan indah yang dapat Anda bayangkan!
Struktur data selalu menjadi struct JSON terlebih dahulu (yang menyandikan struktur JSON asli), diikuti oleh data.
Ini adalah perangkat lunak gratis dan tidak terbebani yang dirilis ke dalam domain publik.
Siapa pun bebas untuk menyalin, memodifikasi, mempublikasikan, menggunakan, mengkompilasi, menjual, atau mendistribusikan perangkat lunak ini, baik dalam bentuk kode sumber atau sebagai biner yang dikompilasi, untuk tujuan apa pun, komersial atau non-komersial, dan dengan cara apa pun.
Dalam yurisdiksi yang mengakui undang -undang hak cipta, penulis atau penulis perangkat lunak ini mendedikasikan setiap dan semua minat hak cipta dalam perangkat lunak ke domain publik. Kami membuat dedikasi ini untuk kepentingan publik pada umumnya dan merugikan ahli waris dan penerus kami. Kami bermaksud pengabdian ini untuk menjadi tindakan pelepasan yang terbuka untuk selamanya dari semua hak saat ini dan di masa depan untuk perangkat lunak ini berdasarkan hukum hak cipta.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.
Untuk informasi lebih lanjut, silakan merujuk ke http://unlicense.org/