JSON是一種經常使用的數據格式,它是在不同語言和平臺之間進行數據交換的重要方式之一。有時候我們需要將JSON字符串反序列化為C語言中的結構體,以便于我們方便地操作數據。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jansson.h>
// 定義一個結構體,用于打印反序列化后的結果
typedef struct
{
char *name;
int age;
char *address;
} Person;
int main()
{
char *json_str = "{\"name\":\"Tom\",\"age\":18,\"address\":\"Shanghai\"}";
json_error_t error;
json_t *root = json_loads(json_str, 0, &error); // 解析JSON字符串
if(!root) // 解析失敗
{
fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
return EXIT_FAILURE;
}
Person p;
memset(&p, 0, sizeof(Person));
// 解析name節點
json_t *name_node = json_object_get(root, "name");
if(json_is_string(name_node)) // 節點類型為字符串
{
p.name = strdup(json_string_value(name_node)); // 獲取字符串內容并保存
}
// 解析age節點
json_t *age_node = json_object_get(root, "age");
if(json_is_integer(age_node)) // 節點類型為整型
{
p.age = json_integer_value(age_node); // 獲取整型內容并保存
}
// 解析address節點
json_t *address_node = json_object_get(root, "address");
if(json_is_string(address_node)) // 節點類型為字符串
{
p.address = strdup(json_string_value(address_node)); // 獲取字符串內容并保存
}
// 打印反序列化結果
printf("Name: %s\nAge: %d\nAddress: %s\n", p.name, p.age, p.address);
// 釋放內存
free(p.name);
free(p.address);
json_decref(root);
return 0;
}
在這個示例中,我們先定義了一個Person結構體,用于保存反序列化后的結果。然后使用json_loads函數將JSON字符串解析為一個json_t對象,如果解析失敗,則輸出錯誤信息并退出程序。
接著,我們使用json_object_get函數獲取JSON節點的內容,并根據節點類型進行解析。如果節點類型為字符串或整型,則使用相應的函數獲取內容并保存到結構體中。
最后,我們打印反序列化結果,釋放相應的內存,并使用json_decref函數釋放json_t對象。
上一篇mysql內部筆記
下一篇python 高斯你和