Простое решение для одного заголовка для анализа JSON в C и C ++.
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 String to Parse.src_size - размер src в байтах. Возвращает struct json_value_s* указывая корень JSON Dom.
Основной структурой для взаимодействия с проанализированной объектной моделью документа JSON (DOM) является struct json_value_s .
struct json_value_s {
void * payload ;
size_t type ;
};payload - указатель на содержимое значения.type - тип структуры payload на один из json_type_e . Примечание. Если тип json_type_true , json_type_false , или json_type_null , полезная нагрузка будет нулевой.Расширенная обрабатайте json String в 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 String to Parse.src_size - размер src в байтах.flags_bitset - Дополнительные флаги анализа, битсет флагов, указанных в enum json_parse_flags_e .alloc_func_ptr - функция обратного вызова для использования для выполнения единого распределения. Если null, malloc() используется.user_data - Пользовательские данные должны быть переданы в качестве первого аргумента alloc_func_ptr .result - результат анализа. Если произошла ошибка анализа, это будет содержать, какой тип ошибки и где в источнике она произошла. Может быть нулевым. Возвращает struct json_value_s* указывая корень JSON Dom.
Дополнительные флаги анализа, которые могут быть указаны на 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 - Разрешить глобальный небрабельный объект. Например, 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 - Разрешить комментарии C -стиля ( // или /* */ ), которые будут проигнорированы во входном файле JSON.json_parse_flags_deprecated - устаревший вариант.json_parse_flags_allow_location_information - Разрешить информацию о местоположении для отслеживания для того, где значения находятся во входе JSON. Полезно для предупреждения пользователей об ошибках с точной информацией о местоположении, относящейся к первоначальному источнику. Когда эта опция включена, все json_value_s* S можно поднять на json_value_ex_s* , а json_string_s* of json_object_element_s* может быть поднят в json_string_ex_s* для получения определенных местоположений на всех значениях и ключах. Примечание. Этот вариант увеличит бюджет памяти, необходимый для DOM, используемого для записи JSON.json_parse_flags_allow_single_quoted_strings - Позволяет строкам быть в 'single quotes' .json_parse_flags_allow_hexadecimal_numbers - позволяет использовать шестнадцатеричные числа 0x42 .json_parse_flags_allow_leading_plus_sign - позволяет ведущий знак « +» на номерах +42 .json_parse_flags_allow_leading_or_trailing_decimal_point - Позволяет, чтобы десятичные точки были ведут или тянутся на 0 цифр .42 или 42. .json_parse_flags_allow_inf_and_nan - позволяет использовать идентификаторы Infinity и NAN 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 '{"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 - Возвращение NONZERO является значением, было истинно, ноль в противном случае.json_value_is_false - Возвращение NONZERO является значением, было ложным, ноль в противном случае.json_value_is_null - Возвращение NonZERO является значением, было нулевым, ноль в противном случае.Давайте посмотрим на тот же пример сверху, но вместо этого используя эти помощники:
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 немного приятнее.
Если вы хотите извлечь значение из 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 один раз, а затем вырезает это единственное распределение, чтобы поддержать все странные и замечательные структуры JSON, которые вы можете себе представить!
Структура данных всегда сначала представляет собой структуру JSON (которая кодирует структуру исходного JSON), за которым следует данные.
Это бесплатное и незаключенное программное обеспечение, выпущенное в общественном достоянии.
Любой может бесплатно копировать, модифицировать, публиковать, использовать, компилировать, продавать или распространять это программное обеспечение, либо в форме исходного кода, либо в качестве составленного двоичного, для любых целей, коммерческих или некоммерческих и любых средств.
В юрисдикциях, которые признают законы об авторском праве, автор или авторы этого программного обеспечения посвящают любой интересный интерес к программному обеспечению в общественное достояние. Мы делаем эту посвящение в интересах общественности в целом и на ущерб нашим наследникам и преемникам. Мы намереваемся стать явным актом отказа от вечности всех нынешних и будущих прав на это программное обеспечение в соответствии с законодательством об авторском праве.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной пригодности, пригодности для определенной цели и несоответствия. Ни в коем случае авторы не должны нести ответственность за любые претензии, ущерб или другую ответственность, будь то в действии контракта, деликте или иным образом, возникающим из или в связи с программным обеспечением или использованием или другими сделками в программном обеспечении.
Для получения дополнительной информации, пожалуйста, обратитесь к http://unlicense.org/