一、解析json数据
1. json_object
json_object是JSON-C库中定义的一个结构体,用于表示JSON对象。
它的内部定义如下:
c
struct json_object {
enum json_type o_type; // JSON对象的类型
union data {
boolean c_boolean; // 布尔类型的值
double c_double; // 双精度浮点数类型的值
int c_int; // 整数类型的值
struct lh_table* c_object; // 对象类型的值
struct array_list* c_array; // 数组类型的值
char* c_string; // 字符串类型的值
} o;
};
2.json_tokener_parse
函数原型:
c
struct json_object* json_tokener_parse(const char* str);
参数:
- str:要解析的 JSON 字符串。
返回值:
- 如果解析成功,返回一个指向 json_object 结构体的指针,表示解析后的 JSON 对象。
- 如果解析失败,返回 NULL。
3.代码实例
c
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>
int main()
{
const char *str = "{\"name\":\"jack\",\"age\":\"22\",\"sex\":\"male\"}";
//把符合json格式的字符串转换成json对象
struct json_object *obj = json_tokener_parse(str);
//把json对象转换成字符串
printf("%s\n", json_object_to_json_string(obj));
return 0;
}
二、创建json对象和添加json对象(string、int)和访问json对象
1. json_object_new_object
在 json-c 库中,json_object_new_object 函数用于创建一个空的 JSON 对象。
函数原型:
c
struct json_object* json_object_new_object(void);
返回值:
- 返回一个指向 json_object 结构体的指针,表示创建的空 JSON 对象。
2.json_object_object_add
在 json-c 库中,json_object_object_add 函数用于向 JSON 对象中添加一个键值对。
以下是该函数的用法:
c
int json_object_object_add(struct json_object* obj, const char* key, struct json_object* val);
_
参数:
参数:
- obj:要添加键值对的 JSON 对象。
- key:要添加的键,以字符串形式表示。
- val:要添加的值,可以是任何 JSON 数据类型的对象。
返回值:
- 如果成功添加键值对,返回 0。
- 如果出现错误,返回 -1。
3.json_object_object_get_ex
在 json-c 库中,json_object_object_get_ex 函数用于从 JSON 对象中获取指定键的值,并将其存储在提供的变量中。
以下是该函数的用法:
c
int json_object_object_get_ex(const struct json_object* obj, const char* key, struct json_object** val);
参数:
- obj:要从中获取值的 JSON 对象。
- key:要获取值的键,以字符串形式表示。
- val:用于存储获取到的值的指针。
返回值:
- 如果找到指定键的值并成功存储在 val 指针中,返回 1。
- 如果未找到指定键的值,返回 0。
使用 json_object_object_get_ex 函数可以从 JSON 对象中获取指定键的值,并将其存储在提供的变量中。你需要传递要获取值的 JSON 对象指针 obj、要获取值的键的字符串表示 key,以及一个指向 json_object* 类型的指针 val,用于存储获取到的值。
4.json_object_get_type
在 json-c 库中,json_object_get_type 函数用于获取 JSON 对象的数据类型。
以下是该函数的用法:
c
enum json_type json_object_get_type(const struct json_object* obj);
参数:
- obj:要获取数据类型的 JSON 对象。
返回值":
返回一个 enum json_type 枚举类型的值,表示 JSON 对象的数据类型。json_type 枚举类型定义了不同的 JSON 数据类型,如下所示:
- json_type_null:表示 JSON 对象是空值(null)。
- json_type_boolean:表示 JSON 对象是布尔值(true 或 false)。
- json_type_double:表示 JSON 对象是双精度浮点数。
- json_type_int:表示 JSON 对象是整数。
- json_type_object:表示 JSON 对象是一个对象。
- json_type_array:表示 JSON 对象是一个数组。
- json_type_string:表示 JSON 对象是一个字符串。
使用 json_object_get_type 函数可以获取 JSON 对象的数据类型。你需要传递要获取数据类型的 JSON 对象指针 obj,然后函数将返回对应的 enum json_type 枚举值。
5.json_object_get_string
json_object_get_string 是 json-c 库中的一个函数,用于获取 JSON 对象中字符串类型的值。
以下是该函数的用法:
c
const char* json_object_get_string(const struct json_object* obj);
参数:
- obj:要获取字符串值的 JSON 对象。
返回值:
- 返回一个指向字符串的指针,表示 JSON 对象中的字符串值。如果 JSON 对象不是字符串类型或者出现错误,返回 NULL。
6.json_object_get_int
json_object_get_int 是 json-c 库中的一个函数,用于获取 JSON 对象中整数类型的值。
以下是该函数的用法:
c
int json_object_get_int(const struct json_object* obj);
参数:
- obj:要获取整数值的 JSON 对象。
返回值:
- 返回 JSON 对象中的整数值。如果 JSON 对象不是整数类型或者出现错误,返回 0。
使用 json_object_get_int 函数可以获取 JSON 对象中整数类型的值。你需要传递要获取整数值的 JSON 对象指针 obj,然后函数将返回该整数值。
7.代码实例
c
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>
int main()
{
//创建json对象
struct json_object *obj = json_object_new_object();
//往json对象添加键值对,json_object_new_string:把字符串转换成json对象
json_object_object_add(obj, "name", json_object_new_string("jack"));
json_object_object_add(obj, "age", json_object_new_int(22));
json_object_object_add(obj, "sex", json_object_new_string("male"));
//打印json对象
printf("%s\n", json_object_to_json_string(obj));
printf("%ld\n", strlen(json_object_to_json_string(obj)));
//解析json
//第一步:根据健名解析出对应的json对象
struct json_object *json;
json_object_object_get_ex(obj, "name", &json);
//第二步:根据json对象类型转换成对应的数据
//先获取json对象类型
json_type type = json_object_get_type(json);
if(json_type_string == type) //判断类型释放一致
printf("name: %s\n", json_object_get_string(json)); //将json对象转换成字符串类型
json_object_object_get_ex(obj, "age", &json);
printf("age: %d\n", json_object_get_int(json));
json_object_object_get_ex(obj, "sex", &json);
printf("sex: %s\n", json_object_get_string(json));
printf("sex: %s\n", json_object_get_string(json));
return 0;
}
三、json数组的添加于解析
1.json_object_new_array
json_object_new_array 是 json-c 库中的一个函数,用于创建一个新的 JSON 数组对象。
以下是该函数的用法:
c
struct json_object* json_object_new_array(void);
返回值:
- 返回一个指向新创建的 JSON 数组对象的指针。
使用 json_object_new_array 函数可以创建一个新的空的 JSON 数组对象。函数将返回一个指向该数组对象的指针,你可以使用这个指针进行后续的操作,如向数组中添加元素。
2.json_object_array_length
json_object_array_length 是 json-c 库中的一个函数,用于获取 JSON 数组对象中元素的个数。
以下是该函数的用法:
c
int json_object_array_length(const struct json_object* obj);
参数:
- obj:要获取元素个数的 JSON 数组对象。
返回值:
- 返回 JSON 数组对象中元素的个数。如果 obj 不是一个 JSON 数组对象,返回 0。
使用 json_object_array_length 函数可以获取 JSON 数组对象中元素的个数。你需要传递要获取元素个数的 JSON 数组对象指针 obj,然后函数将返回该数组对象中元素的个数。
3.json_object_array_get_idx
json_object_array_get_idx 是 json-c 库中的一个函数,用于获取 JSON 数组对象中指定索引位置的元素。
以下是该函数的用法:
c
struct json_object* json_object_array_get_idx(const struct json_object* obj, int idx);
参数:
- obj:要获取元素的 JSON 数组对象。
- idx:要获取元素的索引位置。
返回值:
- 返回 JSON 数组对象中指定索引位置的元素的指针。如果 obj 不是一个 JSON 数组对象或者索引越界,返回 NULL。
使用 json_object_array_get_idx 函数可以获取 JSON 数组对象中指定索引位置的元素。你需要传递要获取元素的 JSON 数组对象指针 obj,以及要获取元素的索引位置 idx。函数将返回指定索引位置的元素的指针。
4. 代码实例
c
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>
int main()
{
struct json_object *obj = json_object_new_object();
json_object_object_add(obj, "name", json_object_new_string("jack"));
//创建json对象数组
struct json_object *array = json_object_new_array();
json_object_array_add(array, json_object_new_int(100));
json_object_array_add(array, json_object_new_int(90));
json_object_array_add(array, json_object_new_int(80));
//把数组对象添加到json对象中
json_object_object_add(obj, "score", array);
printf("%s\n", json_object_to_json_string(obj));
struct json_object *json;
json_object_object_get_ex(obj, "score", &json);
if(json_object_get_type(json) == json_type_array)
{
int size = json_object_array_length(json); //获取json_type_array的长度
for(int i = 0; i < size; i++)
{
struct json_object *j = json_object_array_get_idx(json, i); //根据下标提取json对象
if(json_type_int == json_object_get_type(j))
printf("%d\n", json_object_get_int(j));
}
}
return 0;
}