[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fapi\u002Feduwin-json-api":3},{"id":4,"title":5,"body":6,"description":16,"extension":454,"meta":455,"navigation":354,"path":456,"seo":457,"stem":458,"__hash__":459},"content\u002Fdocs\u002Fapi\u002Feduwin-json-api.md","eduwin JSON API",{"type":7,"value":8,"toc":446},"minimark",[9,13,17,21,38,44,47,63,73,79,106,109,140,153,182,185,200,210,246,250,275,278,313,335,410,413,428,442],[10,11,5],"h1",{"id":12},"eduwin-json-api",[14,15,16],"p",{},"eduwin 内置 cJSON 引擎，提供简洁的 JSON 解析与构建接口。",[18,19,20],"h2",{"id":20},"类型",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-c shiki shiki-themes github-light github-dark","typedef struct cJSON json_t;\n","c","",[29,30,31],"code",{"__ignoreMap":27},[32,33,36],"span",{"class":34,"line":35},"line",1,[32,37,25],{},[14,39,40,43],{},[29,41,42],{},"json_t"," 即 cJSON 结构体，所有 JSON API 均通过此指针操作。",[18,45,46],{"id":46},"解析与释放",[22,48,50],{"className":24,"code":49,"language":26,"meta":27,"style":27},"json_t *json_parse(const char *utf8);\nvoid json_free(json_t *obj);\n",[29,51,52,57],{"__ignoreMap":27},[32,53,54],{"class":34,"line":35},[32,55,56],{},"json_t *json_parse(const char *utf8);\n",[32,58,60],{"class":34,"line":59},2,[32,61,62],{},"void json_free(json_t *obj);\n",[14,64,65,68,69,72],{},[29,66,67],{},"json_parse"," 解析 UTF-8 编码的 JSON 字符串，返回根对象指针。解析失败返回 ",[29,70,71],{},"NULL","。",[14,74,75,78],{},[29,76,77],{},"json_free"," 释放整个 JSON 树。解析得到的对象使用完毕后必须调用此函数释放内存。",[22,80,82],{"className":24,"code":81,"language":26,"meta":27,"style":27},"json_t *root = json_parse(str);\nif (!root) { \u002F* 解析失败 *\u002F }\n\u002F* ... 读取数据 ... *\u002F\njson_free(root);\n",[29,83,84,89,94,100],{"__ignoreMap":27},[32,85,86],{"class":34,"line":35},[32,87,88],{},"json_t *root = json_parse(str);\n",[32,90,91],{"class":34,"line":59},[32,92,93],{},"if (!root) { \u002F* 解析失败 *\u002F }\n",[32,95,97],{"class":34,"line":96},3,[32,98,99],{},"\u002F* ... 读取数据 ... *\u002F\n",[32,101,103],{"class":34,"line":102},4,[32,104,105],{},"json_free(root);\n",[18,107,108],{"id":108},"读取值",[22,110,112],{"className":24,"code":111,"language":26,"meta":27,"style":27},"int json_get_int(json_t *obj, const char *key);\ndouble json_get_double(json_t *obj, const char *key);\nconst char *json_get_str(json_t *obj, const char *key);\njson_t *json_get_obj(json_t *obj, const char *key);\njson_t *json_get_arr(json_t *obj, const char *key);\n",[29,113,114,119,124,129,134],{"__ignoreMap":27},[32,115,116],{"class":34,"line":35},[32,117,118],{},"int json_get_int(json_t *obj, const char *key);\n",[32,120,121],{"class":34,"line":59},[32,122,123],{},"double json_get_double(json_t *obj, const char *key);\n",[32,125,126],{"class":34,"line":96},[32,127,128],{},"const char *json_get_str(json_t *obj, const char *key);\n",[32,130,131],{"class":34,"line":102},[32,132,133],{},"json_t *json_get_obj(json_t *obj, const char *key);\n",[32,135,137],{"class":34,"line":136},5,[32,138,139],{},"json_t *json_get_arr(json_t *obj, const char *key);\n",[14,141,142,143,146,147,146,150,152],{},"从 JSON 对象中按 key 读取对应字段。key 不存在或类型不匹配时返回默认值（",[29,144,145],{},"0"," \u002F ",[29,148,149],{},"0.0",[29,151,71],{},"）。",[22,154,156],{"className":24,"code":155,"language":26,"meta":27,"style":27},"json_t *root = json_parse(str);\nint score = json_get_int(root, \"score\");\nconst char *name = json_get_str(root, \"name\");\njson_t *child = json_get_obj(root, \"config\");\njson_t *items = json_get_arr(root, \"items\");\n",[29,157,158,162,167,172,177],{"__ignoreMap":27},[32,159,160],{"class":34,"line":35},[32,161,88],{},[32,163,164],{"class":34,"line":59},[32,165,166],{},"int score = json_get_int(root, \"score\");\n",[32,168,169],{"class":34,"line":96},[32,170,171],{},"const char *name = json_get_str(root, \"name\");\n",[32,173,174],{"class":34,"line":102},[32,175,176],{},"json_t *child = json_get_obj(root, \"config\");\n",[32,178,179],{"class":34,"line":136},[32,180,181],{},"json_t *items = json_get_arr(root, \"items\");\n",[18,183,184],{"id":184},"数组操作",[22,186,188],{"className":24,"code":187,"language":26,"meta":27,"style":27},"int json_arr_size(json_t *arr);\njson_t *json_arr_get(json_t *arr, int index);\n",[29,189,190,195],{"__ignoreMap":27},[32,191,192],{"class":34,"line":35},[32,193,194],{},"int json_arr_size(json_t *arr);\n",[32,196,197],{"class":34,"line":59},[32,198,199],{},"json_t *json_arr_get(json_t *arr, int index);\n",[14,201,202,205,206,209],{},[29,203,204],{},"json_arr_size"," 返回数组元素个数。",[29,207,208],{},"json_arr_get"," 按索引获取数组元素（从 0 开始）。",[22,211,213],{"className":24,"code":212,"language":26,"meta":27,"style":27},"int n = json_arr_size(arr);\nfor (int i = 0; i \u003C n; i++)\n{\n    json_t *item = json_arr_get(arr, i);\n    const char *name = json_get_str(item, \"name\");\n}\n",[29,214,215,220,225,230,235,240],{"__ignoreMap":27},[32,216,217],{"class":34,"line":35},[32,218,219],{},"int n = json_arr_size(arr);\n",[32,221,222],{"class":34,"line":59},[32,223,224],{},"for (int i = 0; i \u003C n; i++)\n",[32,226,227],{"class":34,"line":96},[32,228,229],{},"{\n",[32,231,232],{"class":34,"line":102},[32,233,234],{},"    json_t *item = json_arr_get(arr, i);\n",[32,236,237],{"class":34,"line":136},[32,238,239],{},"    const char *name = json_get_str(item, \"name\");\n",[32,241,243],{"class":34,"line":242},6,[32,244,245],{},"}\n",[18,247,249],{"id":248},"构建-json","构建 JSON",[22,251,253],{"className":24,"code":252,"language":26,"meta":27,"style":27},"json_t *json_create_obj(void);\njson_t *json_create_arr(void);\njson_t *json_create_str(const char *val);\njson_t *json_create_num(double val);\n",[29,254,255,260,265,270],{"__ignoreMap":27},[32,256,257],{"class":34,"line":35},[32,258,259],{},"json_t *json_create_obj(void);\n",[32,261,262],{"class":34,"line":59},[32,263,264],{},"json_t *json_create_arr(void);\n",[32,266,267],{"class":34,"line":96},[32,268,269],{},"json_t *json_create_str(const char *val);\n",[32,271,272],{"class":34,"line":102},[32,273,274],{},"json_t *json_create_num(double val);\n",[14,276,277],{},"创建空的 JSON 对象或数组。",[22,279,281],{"className":24,"code":280,"language":26,"meta":27,"style":27},"void json_add_int(json_t *obj, const char *key, int val);\nvoid json_add_double(json_t *obj, const char *key, double val);\nvoid json_add_str(json_t *obj, const char *key, const char *val);\nvoid json_add_obj(json_t *obj, const char *key, json_t *val);\nvoid json_add_arr(json_t *obj, const char *key, json_t *val);\nvoid json_arr_add(json_t *arr, json_t *item);\n",[29,282,283,288,293,298,303,308],{"__ignoreMap":27},[32,284,285],{"class":34,"line":35},[32,286,287],{},"void json_add_int(json_t *obj, const char *key, int val);\n",[32,289,290],{"class":34,"line":59},[32,291,292],{},"void json_add_double(json_t *obj, const char *key, double val);\n",[32,294,295],{"class":34,"line":96},[32,296,297],{},"void json_add_str(json_t *obj, const char *key, const char *val);\n",[32,299,300],{"class":34,"line":102},[32,301,302],{},"void json_add_obj(json_t *obj, const char *key, json_t *val);\n",[32,304,305],{"class":34,"line":136},[32,306,307],{},"void json_add_arr(json_t *obj, const char *key, json_t *val);\n",[32,309,310],{"class":34,"line":242},[32,311,312],{},"void json_arr_add(json_t *arr, json_t *item);\n",[14,314,315,316,319,320,323,324,327,328,332,333,72],{},"向对象或数组中添加字段\u002F元素。",[29,317,318],{},"json_add_obj"," 和 ",[29,321,322],{},"json_add_arr"," 会将传入的 ",[29,325,326],{},"json_t*"," 所有权移交给父对象，",[329,330,331],"strong",{},"不要","再对子对象调用 ",[29,334,77],{},[22,336,338],{"className":24,"code":337,"language":26,"meta":27,"style":27},"json_t *root = json_create_obj();\njson_t *arr = json_create_arr();\n\njson_add_str(root, \"name\", \"张三\");\njson_add_int(root, \"age\", 18);\njson_add_arr(root, \"scores\", arr);\n\njson_arr_add(arr, json_create_int(95));\njson_arr_add(arr, json_create_int(88));\n\nchar *out = json_to_str(root);  \u002F* {\"name\":\"张三\",\"age\":18,\"scores\":[95,88]} *\u002F\nfree(out);\njson_free(root);\n",[29,339,340,345,350,356,361,366,371,376,382,388,393,399,405],{"__ignoreMap":27},[32,341,342],{"class":34,"line":35},[32,343,344],{},"json_t *root = json_create_obj();\n",[32,346,347],{"class":34,"line":59},[32,348,349],{},"json_t *arr = json_create_arr();\n",[32,351,352],{"class":34,"line":96},[32,353,355],{"emptyLinePlaceholder":354},true,"\n",[32,357,358],{"class":34,"line":102},[32,359,360],{},"json_add_str(root, \"name\", \"张三\");\n",[32,362,363],{"class":34,"line":136},[32,364,365],{},"json_add_int(root, \"age\", 18);\n",[32,367,368],{"class":34,"line":242},[32,369,370],{},"json_add_arr(root, \"scores\", arr);\n",[32,372,374],{"class":34,"line":373},7,[32,375,355],{"emptyLinePlaceholder":354},[32,377,379],{"class":34,"line":378},8,[32,380,381],{},"json_arr_add(arr, json_create_int(95));\n",[32,383,385],{"class":34,"line":384},9,[32,386,387],{},"json_arr_add(arr, json_create_int(88));\n",[32,389,391],{"class":34,"line":390},10,[32,392,355],{"emptyLinePlaceholder":354},[32,394,396],{"class":34,"line":395},11,[32,397,398],{},"char *out = json_to_str(root);  \u002F* {\"name\":\"张三\",\"age\":18,\"scores\":[95,88]} *\u002F\n",[32,400,402],{"class":34,"line":401},12,[32,403,404],{},"free(out);\n",[32,406,408],{"class":34,"line":407},13,[32,409,105],{},[18,411,412],{"id":412},"输出为字符串",[22,414,416],{"className":24,"code":415,"language":26,"meta":27,"style":27},"char *json_to_str(json_t *root);\nchar *json_to_str_min(json_t *root);\n",[29,417,418,423],{"__ignoreMap":27},[32,419,420],{"class":34,"line":35},[32,421,422],{},"char *json_to_str(json_t *root);\n",[32,424,425],{"class":34,"line":59},[32,426,427],{},"char *json_to_str_min(json_t *root);\n",[14,429,430,433,434,437,438,441],{},[29,431,432],{},"json_to_str"," 返回格式化的 JSON 字符串（带缩进换行）。",[29,435,436],{},"json_to_str_min"," 返回压缩的 JSON 字符串（无空白字符）。返回的字符串需要调用 ",[29,439,440],{},"free()"," 释放。",[443,444,445],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":27,"searchDepth":59,"depth":59,"links":447},[448,449,450,451,452,453],{"id":20,"depth":59,"text":20},{"id":46,"depth":59,"text":46},{"id":108,"depth":59,"text":108},{"id":184,"depth":59,"text":184},{"id":248,"depth":59,"text":249},{"id":412,"depth":59,"text":412},"md",{},"\u002Fdocs\u002Fapi\u002Feduwin-json-api",{"title":5,"description":16},"docs\u002Fapi\u002Feduwin-json-api","PC7K1TAeBrLxdxeEjcjntZX5TZWsqciipkJ-P4veziU",1782488679848]