json-c简介
json-c是一个开源的C语言JSON解析库,它提供了一组函数,用于解析和构建JSON格式的数据。该库可以在OpenWrt中使用,并且非常轻量级和易于使用。
json-c库主要包含以下功能:
- 将JSON格式的字符串转换为JSON对象
- 从JSON对象中获取键值对或数组元素
- 将JSON对象转换为JSON格式的字符串
json-c库的主要优点如下:
- 简单易用 json-c库提供了简单易用的API,使得解析和构建JSON数据非常容易
- 轻量级 json-c库非常轻量级,只有几个文件,易于集成到OpenWrt固件中
- 跨平台 json-c库可以在多个平台上使用,包括OpenWrt、Linux、Windows等
- 开源 json-c库是开源的,可以自由使用和分发
由于json-c库的简单性和易用性,它已经成为OpenWrt固件中处理JSON数据的主要库之一。开发者可以使用json-c库来解析和构建JSON格式的数据,以便进行各种网络应用的开发和数据交换。
json-c api列表
json_object *json_object_new_object(void)
:创建一个新的JSON对象
void json_object_object_add(json_object *jso, const char *key, json_object *val)
:向JSON对象中添加一个键值对
json_object *json_object_object_get(json_object *jso, const char *key)
:获取JSON对象中指定键对应的值
json_type json_object_get_type(json_object *jso)
:获取JSON对象的类型
char *json_object_to_json_string(json_object *jso)
:将JSON对象转换为JSON格式的字符串
json_object *json_tokener_parse(const char *str)
:解析JSON格式的字符串并返回一个对应的JSON对象
void json_object_put(json_object *jso)
:释放JSON对象占用的内存空间
int json_object_array_length(json_object *jso)
:获取JSON数组中元素的个数
json_object *json_object_array_get_idx(json_object *jso, int idx)
:获取JSON数组中指定下标的元素
void json_object_array_add(json_object *jso, json_object *val)
:向JSON数组中添加一个元素
openwrt中如何使用json-c
json-c是一个开源库,openwrt中已经集成了json-c package,我们自己新建的package只需要依赖json-c库即可,注意依赖后还需要在链接json-c库
- 参考实例Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=for_test
PKG_VERSION:=1.0
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/for_test
SECTION:=My Apps
CATEGORY:=My Apps
DEPENDS:=+libuci +libjson-c
TITLE:=for test
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
cp -rf ./src/* $(PKG_BUILD_DIR)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)/ \
CC="$(TARGET_CROSS)gcc" \
CFLAGS="$(TARGET_CFLAGS)" \
LIBS="$(TARGET_LDFLAGS) -lm -luci -ljson-c " \
all
endef
define Build/Compile/Default
endef
define Package/$(PKG_NAME)/description
for test
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/for_test $(1)/usr/bin
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
最重要的就是以下两行,一个是依赖json-c库,另一个是链接库
DEPENDS:=+libuci +libjson-c
LIBS="$(TARGET_LDFLAGS) -lm -luci -ljson-c
json-c api详解
json_object *json_object_new_object(void)
此API用于创建一个新的JSON对象
下面是一个示例代码:
#include <json-c/json.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
return 0;
}
void json_object_object_add(json_object *jso, const char *key, json_object *val)
此API用于向JSON对象中添加一个键值对
下面是一个示例代码:
#include <json-c/json.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
// 向JSON对象中添加一个键值对
json_object_object_add(jobj, "key", json_object_new_string("value"));
return 0;
}
json_object *json_object_object_get(json_object *jso, const char *key)
此API用于获取JSON对象中指定键对应的值,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
// 向JSON对象中添加一个键值对
json_object_object_add(jobj, "key", json_object_new_string("value"));
// 获取JSON对象中指定键对应的值
json_object *value;
json_object_object_get_ex(jobj, "key", &value);
printf("%s\n", json_object_get_string(value));
return 0;
}
json_type json_object_get_type(json_object *jso)
此API用于获取JSON对象的类型,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
// 获取JSON对象的类型
enum json_type type = json_object_get_type(jobj);
printf("type: %d\n", type);
return 0;
}
char *json_object_to_json_string(json_object *jso)
此API用于将JSON对象转换为JSON格式的字符串,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
// 向JSON对象中添加一个键值对
json_object_object_add(jobj, "key", json_object_new_string("value"));
// 将JSON对象转换为JSON格式的字符串
char *json_str = json_object_to_json_string(jobj);
printf("%s\n", json_str);
return 0;
}
json_object *json_tokener_parse(const char *str)
此API用于解析JSON格式的字符串并返回一个对应的JSON对象,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 定义一个JSON格式的字符串
const char *json_str = "{\"key\":\"value\"}";
// 解析JSON格式的字符串并返回一个对应的JSON对象
json_object *jobj;
jobj = json_tokener_parse(json_str);
// 获取JSON对象中指定键对应的值
json_object *value;
json_object_object_get_ex(jobj, "key", &value);
printf("%s\n", json_object_get_string(value));
return 0;
}
int json_object_array_length(json_object *jso)
此API用于获取JSON数组的长度,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON数组
json_object *jarr = json_object_new_array();
// 往JSON数组中添加元素
json_object_array_add(jarr, json_object_new_string("value1"));
json_object_array_add(jarr, json_object_new_string("value2"));
// 获取JSON数组的长度
int length = json_object_array_length(jarr);
printf("length: %d\n", length);
return 0;
}
void json_object_array_add(json_object *jso, json_object *val)
此API用于向JSON数组中添加一个元素,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON数组
json_object *jarr = json_object_new_array();
// 往JSON数组中添加元素
json_object_array_add(jarr, json_object_new_string("value1"));
json_object_array_add(jarr, json_object_new_string("value2"));
// 将JSON数组转换为JSON格式的字符串
char *json_str = json_object_to_json_string(jarr);
printf("%s\n", json_str);
return 0;
}
json_object *json_object_array_get_idx(json_object *jso, int idx)
此API用于获取JSON数组中指定索引位置的元素,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON数组
json_object *jarr = json_object_new_array();
// 往JSON数组中添加元素
json_object_array_add(jarr, json_object_new_string("value1"));
json_object_array_add(jarr, json_object_new_string("value2"));
// 获取JSON数组中指定索引位置的元素
json_object *value = json_object_array_get_idx(jarr, 1);
printf("%s\n", json_object_get_string(value));
return 0;
}
json_bool json_object_object_get_ex(json_object *jso, const char *key, json_object **value)
此API用于获取JSON对象中指定键对应的值,同时返回操作是否成功,下面是一个示例代码:
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个新的JSON对象
json_object *jobj = json_object_new_object();
// 向JSON对象中添加一个键值对
json_object_object_add(jobj, "key", json_object_new_string("value"));
// 获取JSON对象中指定键对应的值
json_object *value;
if (json_object_object_get_ex(jobj, "key", &value)) {
printf("%s\n", json_object_get_string(value));
} else {
printf("key not found\n");
}
return 0;
}
完整实例
- json解析
#include <json-c/json.h>
#include <stdio.h>
int main() {
// JSON格式的字符串
char *json_str = "{\"name\": \"Alice\", \"age\": 25}";
// 解析JSON格式的字符串
json_object *jobj = json_tokener_parse(json_str);
// 获取JSON对象中指定键对应的值
json_object *name = json_object_object_get(jobj, "name");
if (name != NULL) {
printf("name: %s\n", json_object_get_string(name));
} else {
printf("name not found\n");
}
// 获取JSON对象中指定键对应的值
json_object *age = json_object_object_get(jobj, "age");
if (age != NULL) {
printf("age: %d\n", json_object_get_int(age));
} else {
printf("age not found\n");
}
return 0;
}
在此示例中,我们使用json_object_object_get函数获取JSON对象中指定键对应的值,如果值存在,则输出它的值;否则输出not found提示。这种方法与json_object_object_get_ex函数相比,不会检查指定键是否存在,因此需要手动检查返回值是否为NULL。
- json对象创建
#include <json-c/json.h>
#include <stdio.h>
int main() {
// 创建一个空的JSON对象
json_object *jobj = json_object_new_object();
// 添加一个字符串类型的键值对
json_object_object_add(jobj, "name", json_object_new_string("Alice"));
// 添加一个整数类型的键值对
json_object_object_add(jobj, "age", json_object_new_int(25));
// 创建一个空的JSON数组
json_object *jarray = json_object_new_array();
// 添加一个字符串类型的元素到数组中
json_object_array_add(jarray, json_object_new_string("item1"));
// 添加一个整数类型的元素到数组中
json_object_array_add(jarray, json_object_new_int(100));
// 添加JSON数组到JSON对象中
json_object_object_add(jobj, "items", jarray);
// 将JSON对象转换为JSON格式的字符串
char *json_str = json_object_to_json_string(jobj);
// 输出JSON格式的字符串
printf("%s\n", json_str);
// 释放JSON对象的内存
json_object_put(jobj);
return 0;
}
在此示例中,我们首先创建一个空的JSON对象,并使用json_object_object_add函数添加一个字符串类型和一个整数类型的键值对。然后,我们创建一个空的JSON数组,并使用json_object_array_add函数将一个字符串类型和一个整数类型的元素添加到数组中。接着,我们使用json_object_object_add函数将JSON数组添加到JSON对象中。最后,我们使用json_object_to_json_string函数将JSON对象转换为JSON格式的字符串,并输出该字符串。最终的JSON格式的字符串如下所示:
{"name":"Alice","age":25,"items":["item1",100]}
json对象创建(带数组)
#include <json-c/json.h>
#include <stdio.h>
int main() {
// JSON格式的字符串
const char *json_str = "{\"items\":[\"item1\",100]}";
// 将JSON格式的字符串转换为JSON对象
json_object *jobj = json_tokener_parse(json_str);
// 获取JSON数组对象
json_object *jarray = json_object_object_get(jobj, "items");
// 获取JSON数组中元素的数量
int len = json_object_array_length(jarray);
// 遍历JSON数组中的所有元素并输出到控制台
for (int i = 0; i < len; i++) {
// 获取JSON数组中指定索引位置的元素
json_object *jitem = json_object_array_get_idx(jarray, i);
// 将元素转换为字符串并输出到控制台
printf("%s\n", json_object_get_string(jitem));
}
// 释放JSON对象的内存
json_object_put(jobj);
return 0;
}
在此示例中,我们首先将JSON格式的字符串转换为JSON对象,并使用json_object_object_get函数获取JSON数组对象。接着,我们使用json_object_array_length函数获取JSON数组中元素的数量,并使用json_object_array_get_idx函数遍历JSON数组中的所有元素并输出到控制台。最后,我们使用json_object_put函数释放JSON对象的内存。如果我们运行这个程序,它将输出以下内容:
item1
100
评论(0)