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 중 하나 인 구조물 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 - 구문 분석 결과. 구문 분석 오류가 발생하면 여기에는 어떤 유형의 오류와 소스에서 발생한 위치가 포함됩니다. 널가 될 수 있습니다. 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 글로벌 뇌화되지 않은 개체를 허용합니다. 예를 들어, 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 16 진수를 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 인피니티 및 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 비존이 아닌 값은 값이 true, 그렇지 않으면 0입니다.json_value_is_false 값이 아닌 값은 값이 false, 그렇지 않으면 0입니다.json_value_is_null 값이 아닌 값은 값이 null, 그렇지 않으면 0입니다.위의 동일한 예를 살펴 보지만 대신 이러한 도우미 반복자를 사용하십시오.
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 structs (원래 JSON의 구조를 인코딩) 한 다음 데이터가 뒤 따릅니다.
이것은 무료 및 방해받지 않은 소프트웨어가 공개 도메인에 방출됩니다.
누구나이 소스 소스 양식 또는 컴파일 된 바이너리로, 상업적 또는 비상업적으로 어떤 식 으로든 복사, 수정, 게시, 컴파일, 판매 또는 배포 할 수 있습니다.
저작권법을 인식하는 관할 구역 에서이 소프트웨어의 저자 또는 저자는 소프트웨어에 대한 모든 저작권을 공개 도메인에 전념합니다. 우리는 대중의 이익을 크게 그리고 상속인과 후계자들의 손해를 위해이 헌신을합니다. 우리는이 헌신이 저작권법에 따라이 소프트웨어에 대한 모든 현재와 미래의 권리를 영구적으로 영구적으로 포기하는 명백한 행위가 될 계획입니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증없이 "그대로"제공됩니다. 어떠한 경우에도 저자는 계약, 불법 행위 또는 기타 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.
자세한 내용은 http://unlicense.org/를 참조하십시오.