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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。