//从json str中取值,type,0:char;other:int int GetStrInBuf_x( char *json_str, char *Keygroup, char* Keyname,char *KeyVal, int type) { char buf[512] = {0}; char buf1[512] = {0}; FILE *fp; char docat[128] = {0}; long profilelen; printf("input1:%s %s %s\n", json_str, Keygroup, Keyname); struct json_object* json_obj = json_tokener_parse(json_str); const char* json_s = json_object_to_json_string(json_obj); printf("ss%s\n", json_s); struct json_object *person = json_object_object_get(json_obj, "data"); printf("ssss\n"); // printf("Age: %d\n", json_object_get_int(json_object_object_get(json_obj, "age"))); printf("p:%s\n", json_object_to_json_string(person)); memset(buf, 0x00, sizeof(buf)); if(type == 0) { strcpy(buf, json_object_get_string(json_object_object_get(person, Keyname))); if(strlen(buf) == 0) { memset(KeyVal, 0x00, sizeof(KeyVal)); } else{ snprintf(KeyVal, (strlen(buf)+1), "%s", buf); printf("name:%s,value_str:%s\n", Keyname, KeyVal); } } else { int str_value = json_object_get_int(json_object_object_get(person, Keyname)); sprintf(KeyVal,"%d", str_value); printf("name:%s,value_in:%s\n", Keyname, KeyVal); } memset(json_obj, 0x00, strlen(json_obj) + 1); json_object_put(json_obj); return 0; }
时间: 2024-03-29 15:40:39 浏览: 22
此函数可以实现从json字符串中取值,返回值为整型的时候可以取整型值,返回值为字符串的时候可以取字符串值。
该函数的具体实现过程如下:
1.调用json_tokener_parse函数将json字符串转换为json_object对象。
2.使用json_object_object_get函数获取json_object对象中指定键值(Keygroup)对应的值(person)。
3.使用json_object_object_get函数获取person对象中指定键值(Keyname)对应的值,并根据type参数的值判断返回的值是整型还是字符串类型。
4.将获取到的值存储到KeyVal参数中,并打印出来。
5.释放json_object对象的内存。
需要注意的是,在使用完json_object对象后,需要调用json_object_put函数释放该对象的内存,否则可能会出现内存泄漏的问题。
此外,由于该函数中使用了一些未定义的变量和函数,比如FILE *fp、long profilelen、memset等,因此需要在函数外部定义或使用已经定义过的变量和函数。
相关问题
Json::Reader 如何解析char*中存放的json数据
可以使用JsonCpp库中的Json::Reader类来解析char*中存放的json数据。可以按照以下步骤进行操作:
1. 创建Json::Reader对象。
2. 调用Json::Reader对象的parse函数,将char*中的json数据作为参数传入。
3. 判断解析是否成功,可以通过Json::Reader对象的parse函数的返回值来判断。如果解析成功,返回值为true;如果解析失败,返回值为false。
4. 如果解析成功,可以通过Json::Value对象来获取解析结果,Json::Value对象可以通过Json::Reader对象的getJsonRootValue函数来获取。
以下是一个示例代码:
```c++
#include "json/json.h"
#include <iostream>
using namespace std;
int main() {
char* json_str = "{\"name\": \"Tom\", \"age\": 18}";
Json::Reader reader;
Json::Value root;
bool parsing_successful = reader.parse(json_str, root);
if (!parsing_successful) {
cerr << "Failed to parse json string!" << endl;
return 1;
}
string name = root["name"].asString();
int age = root["age"].asInt();
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
return 0;
}
```
在上面的示例中,我们将一个json字符串解析为一个Json::Value对象,并获取了其中的"name"和"age"字段的值。注意,在实际使用中,我们需要对解析结果进行适当的校验,以避免程序崩溃或出现不可预期的错误。
给下面代码每一行添加注释 并指出问题#include <jansson.h> int main() { json_t *root; json_error_t error; /* 从文件中读取 JSON 数据 */ root = json_load_file("example.json", 0, &error); /* 遍历 JSON 对象中的所有键值对,并获取键的名称 */ const char *key_name; json_t *value; int key_count = json_object_size(root); const char *key_names[key_count]; int i = 0; json_object_foreach(root, key, val) { key_name = json_object_iter_key(val); key_names[i] = key_name; i++; } /* 输出所有键的名称 */ for (int i = 0; i < key_count; i++) { printf("key_name[%d]: %s\n", i, key_names[i]); } /* 释放内存 */ json_decref(root); return 0; }
注释如下:
```c
#include <jansson.h> // 包含 jansson 库
int main() {
json_t *root; // 定义 json_t 类型的指针变量 root
json_error_t error; // 定义 json_error_t 类型的变量 error,用于存储 jansson 库中的错误信息
/* 从文件中读取 JSON 数据 */
root = json_load_file("example.json", 0, &error); // 从 example.json 文件中加载 JSON 数据到 root 变量中,并将错误信息存储在 error 变量中
/* 遍历 JSON 对象中的所有键值对,并获取键的名称 */
const char *key_name; // 定义一个指向 char 类型的常量指针 key_name,用于存储 JSON 对象中的键名
json_t *value; // 定义 json_t 类型的指针变量 value,用于存储 JSON 对象中的键值
int key_count = json_object_size(root); // 获取 JSON 对象中键值对的数量
const char *key_names[key_count]; // 定义一个指向 char 类型的常量指针数组 key_names,用于存储所有键名
int i = 0; // 初始化计数器 i
json_object_foreach(root, key, val) { // 遍历 JSON 对象中的键值对
key_name = json_object_iter_key(val); // 获取键名
key_names[i] = key_name; // 将键名存储到 key_names 数组中
i++; // 计数器加一
}
/* 输出所有键的名称 */
for (int i = 0; i < key_count; i++) { // 遍历 key_names 数组
printf("key_name[%d]: %s\n", i, key_names[i]); // 输出键名
}
/* 释放内存 */
json_decref(root); // 释放 root 变量占用的内存
return 0; // 返回 0 表示程序正常结束
}
```
代码本身没有明显的问题,只是需要确保 example.json 文件存在并包含有效的 JSON 数据。同时,也需要确保 jansson 库已经正确安装。