C程序中数据封装和解析也可以用到JSON,不过需要额外添加json.h库
#include
//用于存储数据
int array_number;
char wifiname_user[100][100];
char encryption_user[100][100];
char signal_user[100][100];
char channel_user[100][100];
//解析json函数
int AnalyJson(char *data);
//修剪string函数
char *PruneString(char *Pstr);
int main()
{
int status = AnalyJson(String);
if(status != 0)
{
printf("Can't Json!");
return -1;
}
for(j = 0;j < array_number;j++)
{
printf("%s",wifiname_user[j]);
}
return 0;
}
int AnalyJson(char *data)
{
//printf("data is %s\n\n",data);
//json数据集
struct json_object *new_obj = NULL;
//data数据域
struct json_object *obj_array = NULL;
//每一条数据
struct json_object *array_string = NULL;
//键值key
struct json_object *string_wifiname , *string_encryption , *int_signal , *int_channel;
//数组个数计数
int i;
//数据集长度
int len = strlen(data);
//修剪字符串
char prune_wifiname[100] = {0};
char prune_encryption[100] = {0};
//char wifiname_str[100] = {0};
//判断数据长度,不符合长度,当错误数据处理
if (len > 10)
{
//判断数据是否完整
//if((data[0] == '{') && (data[len-1] == '}'))
if(data[0] == '{')
{
//将数据集转json格式
new_obj = json_tokener_parse(data);
//判断json格式是否正确
if (is_error(new_obj))
{
printf("json格式错误!\n");
//释放new_obj
json_object_put(new_obj);
}
else
{
//获得key为name的值
obj_array = json_object_object_get(new_obj,"data");
//打印json_object类型
//printf("data = %s\n",json_object_to_json_string(obj_array));
//数组个数
array_number = json_object_array_length(obj_array);
//printf("length = %d\n",array_number);
//循环解析
for (i = 0 ; i < array_number ; i++)
{
//取出每一条数据
array_string = json_object_array_get_idx(obj_array,i);
//printf("string_array %d is %s\n",i,json_object_to_json_string(array_string));
//取键值对
string_wifiname= json_object_object_get(array_string,"wifiname");
string_encryption= json_object_object_get(array_string,"encryption");
int_signal= json_object_object_get(array_string,"signal");
int_channel= json_object_object_get(array_string,"channel");
//写入数组中,保存全局
sprintf(prune_wifiname,"%s",json_object_to_json_string(string_wifiname));
sprintf(prune_encryption,"%s",json_object_to_json_string(string_encryption));
sprintf(wifiname_user[i],"%s",PruneString(prune_wifiname));
sprintf(encryption_user[i],"%s",PruneString(prune_encryption));
sprintf(signal_user[i],"%s",json_object_to_json_string(int_signal));
sprintf(channel_user[i],"%s",json_object_to_json_string(int_channel));
json_object_put(array_string);
}
//释放数据集
json_object_put(obj_array);
json_object_put(new_obj);
}
}
else
{
printf("数据不完整!\n");
return -1;
}
}
else
{
printf("数据大小错误!\n");
return -1;
}
return 0;
}
char *PruneString(char *Pstr)
{
char *wifiname_str = (char *)malloc(100);
int str_len = strlen(Pstr);
int j;
for (j = 0 ; j < str_len ; j++)
{
wifiname_str[j] = Pstr[j + 1];
}
wifiname_str[str_len - 2] = '\0';
//printf("%s len = %d -> %s\n",Pstr,str_len,wifiname_str);
return wifiname_str;
}