c json解析示例

json-c是最主流的json c庫。
[root@hs-10-20-30-193 build]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. -- The C compiler identification is GNU 4.8.5 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc - works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Looking for sys/resource.h -- Looking for sys/resource.h - found -- Looking for getrusage -- Looking for getrusage - found -- Wrote /home/zjh/json-c-json-c-0.16-20220414/build/apps_config.h -- Looking for fcntl.h -- Looking for fcntl.h - found -- Looking for inttypes.h -- Looking for inttypes.h - found -- Looking for stdarg.h -- Looking for stdarg.h - found -- Looking for strings.h -- Looking for strings.h - found -- Looking for string.h -- Looking for string.h - found -- Looking for syslog.h -- Looking for syslog.h - found -- Looking for 4 include files stdlib.h, ..., float.h -- Looking for 4 include files stdlib.h, ..., float.h - found -- Looking for unistd.h -- Looking for unistd.h - found -- Looking for sys/types.h -- Looking for sys/types.h - found -- Looking for dlfcn.h -- Looking for dlfcn.h - found -- Looking for endian.h -- Looking for endian.h - found -- Looking for limits.h -- Looking for limits.h - found -- Looking for locale.h -- Looking for locale.h - found -- Looking for memory.h -- Looking for memory.h - found -- Looking for stdint.h -- Looking for stdint.h - found -- Looking for stdlib.h -- Looking for stdlib.h - found -- Looking for sys/cdefs.h -- Looking for sys/cdefs.h - found -- Looking for sys/param.h -- Looking for sys/param.h - found -- Looking for sys/random.h -- Looking for sys/random.h - not found -- Looking for sys/stat.h -- Looking for sys/stat.h - found -- Looking for xlocale.h -- Looking for xlocale.h - found -- Looking for _isnan -- Looking for _isnan - not found -- Looking for _finite -- Looking for _finite - not found -- Looking for INFINITY -- Looking for INFINITY - found -- Looking for isinf -- Looking for isinf - found -- Looking for isnan -- Looking for isnan - found -- Looking for nan -- Looking for nan - found -- Looking for _doprnt -- Looking for _doprnt - not found -- Looking for snprintf -- Looking for snprintf - found -- Looking for vasprintf -- Looking for vasprintf - found -- Looking for vsnprintf -- Looking for vsnprintf - found -- Looking for vprintf -- Looking for vprintf - found -- Looking for arc4random -- Looking for arc4random - not found -- Looking for bsd/stdlib.h -- Looking for bsd/stdlib.h - not found -- Looking for open -- Looking for open - found -- Looking for realloc -- Looking for realloc - found -- Looking for setlocale -- Looking for setlocale - found -- Looking for uselocale -- Looking for uselocale - found -- Looking for strcasecmp -- Looking for strcasecmp - found -- Looking for strncasecmp -- Looking for strncasecmp - found -- Looking for strdup -- Looking for strdup - found -- Looking for strerror -- Looking for strerror - found -- Looking for vsyslog -- Looking for vsyslog - found -- Looking for strtoll -- Looking for strtoll - found -- Looking for strtoull -- Looking for strtoull - found -- Looking for stddef.h -- Looking for stddef.h - found -- Check size of int -- Check size of int - done -- Check size of int64_t -- Check size of int64_t - done -- Check size of long -- Check size of long - done -- Check size of long long -- Check size of long long - done -- Check size of size_t -- Check size of size_t - done -- Check size of ssize_t -- Check size of ssize_t - done -- Performing Test HAS_GNU_WARNING_LONG -- Performing Test HAS_GNU_WARNING_LONG - Failed -- Performing Test HAVE_ATOMIC_BUILTINS -- Performing Test HAVE_ATOMIC_BUILTINS - Success -- Performing Test HAVE___THREAD -- Performing Test HAVE___THREAD - Success -- Wrote /home/zjh/json-c-json-c-0.16-20220414/build/config.h -- Wrote /home/zjh/json-c-json-c-0.16-20220414/build/json_config.h -- Performing Test REENTRANT_WORKS -- Performing Test REENTRANT_WORKS - Success -- Performing Test BSYMBOLIC_WORKS -- Performing Test BSYMBOLIC_WORKS - Success -- Performing Test VERSION_SCRIPT_WORKS -- Performing Test VERSION_SCRIPT_WORKS - Success -- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) Warning: doxygen not found, the 'doc' target will not be included -- Configuring done -- Generating done -- Build files have been written to: /home/zjh/json-c-json-c-0.16-20220414/build [root@hs-10-20-30-193 build]# make all install Scanning dependencies of target json-c [ 1%] Building C object CMakeFiles/json-c.dir/arraylist.c.o [ 2%] Building C object CMakeFiles/json-c.dir/debug.c.o [ 3%] Building C object CMakeFiles/json-c.dir/json_c_version.c.o [ 4%] Building C object CMakeFiles/json-c.dir/json_object.c.o [ 5%] Building C object CMakeFiles/json-c.dir/json_object_iterator.c.o [ 7%] Building C object CMakeFiles/json-c.dir/json_tokener.c.o [ 8%] Building C object CMakeFiles/json-c.dir/json_util.c.o [ 9%] Building C object CMakeFiles/json-c.dir/json_visit.c.o [ 10%] Building C object CMakeFiles/json-c.dir/linkhash.c.o [ 11%] Building C object CMakeFiles/json-c.dir/printbuf.c.o [ 13%] Building C object CMakeFiles/json-c.dir/random_seed.c.o [ 14%] Building C object CMakeFiles/json-c.dir/strerror_override.c.o [ 15%] Building C object CMakeFiles/json-c.dir/json_pointer.c.o [ 16%] Linking C shared library libjson-c.so [ 16%] Built target json-c Scanning dependencies of target json-c-static [ 17%] Building C object CMakeFiles/json-c-static.dir/arraylist.c.o [ 19%] Building C object CMakeFiles/json-c-static.dir/debug.c.o [ 20%] Building C object CMakeFiles/json-c-static.dir/json_c_version.c.o [ 21%] Building C object CMakeFiles/json-c-static.dir/json_object.c.o [ 22%] Building C object CMakeFiles/json-c-static.dir/json_object_iterator.c.o [ 23%] Building C object CMakeFiles/json-c-static.dir/json_tokener.c.o [ 25%] Building C object CMakeFiles/json-c-static.dir/json_util.c.o [ 26%] Building C object CMakeFiles/json-c-static.dir/json_visit.c.o [ 27%] Building C object CMakeFiles/json-c-static.dir/linkhash.c.o [ 28%] Building C object CMakeFiles/json-c-static.dir/printbuf.c.o [ 29%] Building C object CMakeFiles/json-c-static.dir/random_seed.c.o [ 30%] Building C object CMakeFiles/json-c-static.dir/strerror_override.c.o [ 32%] Building C object CMakeFiles/json-c-static.dir/json_pointer.c.o [ 33%] Linking C static library libjson-c.a [ 33%] Built target json-c-static Scanning dependencies of target test_json_pointer [ 34%] Building C object tests/CMakeFiles/test_json_pointer.dir/test_json_pointer.c.o [ 35%] Linking C executable test_json_pointer [ 35%] Built target test_json_pointer Scanning dependencies of target test_visit [ 36%] Building C object tests/CMakeFiles/test_visit.dir/test_visit.c.o [ 38%] Linking C executable test_visit [ 38%] Built target test_visit Scanning dependencies of target test_cast [ 39%] Building C object tests/CMakeFiles/test_cast.dir/test_cast.c.o [ 40%] Linking C executable test_cast [ 40%] Built target test_cast Scanning dependencies of target testReplaceExisting [ 41%] Building C object tests/CMakeFiles/testReplaceExisting.dir/testReplaceExisting.c.o [ 42%] Linking C executable testReplaceExisting [ 42%] Built target testReplaceExisting Scanning dependencies of target test4 [ 44%] Building C object tests/CMakeFiles/test4.dir/test4.c.o [ 45%] Linking C executable test4 [ 45%] Built target test4 Scanning dependencies of target test_int_add [ 46%] Building C object tests/CMakeFiles/test_int_add.dir/test_int_add.c.o [ 47%] Linking C executable test_int_add [ 47%] Built target test_int_add Scanning dependencies of target test_compare [ 48%] Building C object tests/CMakeFiles/test_compare.dir/test_compare.c.o [ 50%] Linking C executable test_compare [ 50%] Built target test_compare Scanning dependencies of target test1 [ 51%] Building C object tests/CMakeFiles/test1.dir/test1.c.o [ 52%] Linking C executable test1 [ 52%] Built target test1 Scanning dependencies of target test_deep_copy [ 53%] Building C object tests/CMakeFiles/test_deep_copy.dir/test_deep_copy.c.o [ 54%] Linking C executable test_deep_copy [ 54%] Built target test_deep_copy Scanning dependencies of target test_parse_int64 [ 55%] Building C object tests/CMakeFiles/test_parse_int64.dir/test_parse_int64.c.o [ 57%] Linking C executable test_parse_int64 [ 57%] Built target test_parse_int64 Scanning dependencies of target test2Formatted [ 58%] Building C object tests/CMakeFiles/test2Formatted.dir/test2.c.o [ 59%] Building C object tests/CMakeFiles/test2Formatted.dir/parse_flags.c.o [ 60%] Linking C executable test2Formatted [ 60%] Built target test2Formatted Scanning dependencies of target test_util_file [ 61%] Building C object tests/CMakeFiles/test_util_file.dir/test_util_file.c.o [ 63%] Building C object tests/CMakeFiles/test_util_file.dir/__/strerror_override.c.o [ 64%] Linking C executable test_util_file [ 64%] Built target test_util_file Scanning dependencies of target test2 [ 65%] Building C object tests/CMakeFiles/test2.dir/test2.c.o [ 66%] Linking C executable test2 [ 66%] Built target test2 Scanning dependencies of target test_locale [ 67%] Building C object tests/CMakeFiles/test_locale.dir/test_locale.c.o [ 69%] Linking C executable test_locale [ 69%] Built target test_locale Scanning dependencies of target test_printbuf [ 70%] Building C object tests/CMakeFiles/test_printbuf.dir/test_printbuf.c.o [ 71%] Linking C executable test_printbuf [ 71%] Built target test_printbuf Scanning dependencies of target test1Formatted [ 72%] Building C object tests/CMakeFiles/test1Formatted.dir/test1.c.o [ 73%] Building C object tests/CMakeFiles/test1Formatted.dir/parse_flags.c.o [ 75%] Linking C executable test1Formatted [ 75%] Built target test1Formatted Scanning dependencies of target test_float [ 76%] Building C object tests/CMakeFiles/test_float.dir/test_float.c.o [ 77%] Linking C executable test_float [ 77%] Built target test_float Scanning dependencies of target test_object_iterator [ 78%] Building C object tests/CMakeFiles/test_object_iterator.dir/test_object_iterator.c.o [ 79%] Linking C executable test_object_iterator [ 79%] Built target test_object_iterator Scanning dependencies of target test_null [ 80%] Building C object tests/CMakeFiles/test_null.dir/test_null.c.o [ 82%] Linking C executable test_null [ 82%] Built target test_null Scanning dependencies of target test_double_serializer [ 83%] Building C object tests/CMakeFiles/test_double_serializer.dir/test_double_serializer.c.o [ 84%] Linking C executable test_double_serializer [ 84%] Built target test_double_serializer Scanning dependencies of target test_parse [ 85%] Building C object tests/CMakeFiles/test_parse.dir/test_parse.c.o [ 86%] Linking C executable test_parse [ 86%] Built target test_parse Scanning dependencies of target test_set_serializer [ 88%] Building C object tests/CMakeFiles/test_set_serializer.dir/test_set_serializer.c.o [ 89%] Linking C executable test_set_serializer [ 89%] Built target test_set_serializer Scanning dependencies of target test_set_value [ 90%] Building C object tests/CMakeFiles/test_set_value.dir/test_set_value.c.o [ 91%] Linking C executable test_set_value [ 91%] Built target test_set_value Scanning dependencies of target test_charcase [ 92%] Building C object tests/CMakeFiles/test_charcase.dir/test_charcase.c.o [ 94%] Linking C executable test_charcase [ 94%] Built target test_charcase Scanning dependencies of target test_strerror [ 95%] Building C object tests/CMakeFiles/test_strerror.dir/test_strerror.c.o [ 96%] Building C object tests/CMakeFiles/test_strerror.dir/__/strerror_override.c.o [ 97%] Linking C executable test_strerror [ 97%] Built target test_strerror Scanning dependencies of target json_parse [ 98%] Building C object apps/CMakeFiles/json_parse.dir/json_parse.c.o [100%] Linking C executable json_parse [100%] Built target json_parse Install the project... -- Install configuration: "debug" -- Installing: /usr/local/lib64/libjson-c.so.5.2.0 -- Up-to-date: /usr/local/lib64/libjson-c.so.5 -- Up-to-date: /usr/local/lib64/libjson-c.so -- Installing: /usr/local/lib64/libjson-c.a -- Installing: /usr/local/lib64/cmake/json-c/json-c-targets.cmake -- Installing: /usr/local/lib64/cmake/json-c/json-c-targets-debug.cmake -- Installing: /usr/local/lib64/cmake/json-c/json-c-config.cmake -- Installing: /usr/local/lib64/pkgconfig/json-c.pc -- Installing: /usr/local/include/json-c/json_config.h -- Installing: /usr/local/include/json-c/json.h -- Installing: /usr/local/include/json-c/arraylist.h -- Installing: /usr/local/include/json-c/debug.h -- Installing: /usr/local/include/json-c/json_c_version.h -- Installing: /usr/local/include/json-c/json_inttypes.h -- Installing: /usr/local/include/json-c/json_object.h -- Installing: /usr/local/include/json-c/json_object_iterator.h -- Installing: /usr/local/include/json-c/json_tokener.h -- Installing: /usr/local/include/json-c/json_types.h -- Installing: /usr/local/include/json-c/json_util.h -- Installing: /usr/local/include/json-c/json_visit.h -- Installing: /usr/local/include/json-c/linkhash.h -- Installing: /usr/local/include/json-c/printbuf.h -- Installing: /usr/local/include/json-c/json_pointer.h
// 解析字符串
    json_object* root = json_tokener_parse(json_str);
// 獲取根節點裏面的"C"屬性
    json_object* changes = json_object_object_get(root, "C");
    
// 判斷json屬性值的類型
    if (json_object_get_type(changes) == json_type_null)
    {
        printf("empty xlog record, just a ddl or not supported dml(not insert/update/delete/truncate)\n");
        return OCI_SUCCESS;
    }
    else
    {
        int change_rows = json_object_array_length(changes); // 獲取json數組的長度
        
        if (change_rows > 2)
            json_object_array_sort(changes, json_sort_by_obj_kind_func);  // json數組排序
......
    // 獲取json數組中某個成員的值
                record = json_object_array_get_idx(changes, i);
                record_attr = json_object_object_get(record, "K");
                const char* dml_type = json_object_get_string(record_attr);   // json對象轉字符串
void json_object_array_sort(struct json_object *jso, int (*sort_fn)(const void *, const void *))
{
    assert(json_object_get_type(jso) == json_type_array);
    array_list_sort(JC_ARRAY(jso)->c_array, sort_fn);
}

// 排序函數
static int json_sort_by_obj_kind_func(const void* j1, const void* j2)
{
    json_object* const* jso1, * const* jso2;
    char str1[65] = { 0 }, str2[65] = { 0 };

    jso1 = (json_object* const*)j1;
    jso2 = (json_object* const*)j2;

    if (!*jso1 && !*jso2)
        return 0;
    if (!*jso1)
        return -1;
    if (!*jso2)
        return 1;

    snprintf(str1, 64, "%s %s %s",
        json_object_get_string(json_object_object_get(*jso1, "K")),
        json_object_get_string(json_object_object_get(*jso1, "T")),
        json_object_get_string(json_object_object_get(*jso1, "S")));
    snprintf(str2, 64, "%s %s %s",
        json_object_get_string(json_object_object_get(*jso2, "K")),
        json_object_get_string(json_object_object_get(*jso2, "T")),
        json_object_get_string(json_object_object_get(*jso2, "S")));

    return strcmp(str1, str2);
}

https://www.cnblogs.com/qingergege/p/5997762.html  json-c開發指南 

https://json-c.github.io/json-c/json-c-current-release/doc/html/index.html

https://github.com/miloyip/nativejson-benchmark  json c/c++庫性能對比

http://json-c.github.io/json-c/json-c-current-release/doc/html/json__object_8h.html

https://www.jianshu.com/p/659bb1b09f1b JSON解析器json-c

https://joysofprogramming.com/programming-tutorials/json-c-libjson-tutorial/   json c示例

https://github.com/rbtylee/tutorial-jsonc/blob/master/tutorial/index.md  官方示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章