C、C++中对json格式数据的解析和封装

C:首先需要调库:#include

Json的数据结构介绍:
/* The cJSON structure: */
typedef struct cJSON
{
/*next/prev允许您遍历数组/对象链。或者,使用GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *next;
struct cJSON *prev;
/* 数组或对象项将有一个子指针指向数组/对象中的项链。 */
struct cJSON *child;

/* 项目的类型,如上所述。*/
int type;

/* 字符串, if type==cJSON_String */
char *valuestring;
/* 数值, if type==cJSON_Number */
int valueint;
/* 小数数据, if type==cJSON_Number */
double valuedouble;

/* 项的名称字符串,如果此项是的子项,或在对象的子项列表中。*/
char *string;
} cJSON;
Json格式文本解析:
#define TEST2 "{\n\"auth\": \"auc_d0dd49997dd17b12f76b74fe51d0de3fd772718b\",\n\"sessionId\": \"5129110798518519880764729435382\"\n}"
char* buffer = TEST2;
cJSON* json = cJSON_Parse(buffer);
cJSON* name = cJSON_GetObjectItem(json, "name");
cJSON* num = cJSON_GetObjectItem(json, "num");
printf("%s,%s",name->valuestring,num->valueint);


假设文本为:需要解析中间的pinyin,textContent,title
"Data":
    {
        "listItems":
				[
					{
						"htmlView":"http://hanyu.baidu.com/s?wd=一飞冲天&ptype=zici",
						"mediaId":"6f7af22ba4613b869f455d569c204c69",
						"selfData":"{\"interpretation\":\"鸟儿展翅一飞,直冲云霄。比喻平时没有特殊表现,一下做出了惊人的成绩。\",\"lemma\":\"一飞冲天\",\"pinyin\":\"[yī fēi chōng tiān]\"}\n",
						"textContent":"鸟儿展翅一飞,直冲云霄。比喻平时没有特殊表现,一下做出了惊人的成绩。",
						"title":"一飞冲天"
					}
				]
    }

cJSON* Data = cJSON_GetObjectItem(json, "Data");
cJSON* ListItems = cJSON_GetObjectItem(Data, "listItems");
cJSON* Json_Array = cJSON_GetArrayItem(ListItems, 0);//其中[]里面为数组需要用cJSON_GetArrayItem,0代表第一个。
cJSON* TextContent = cJSON_GetObjectItem(Json_Array, "textContent");
cJSON* Title = cJSON_GetObjectItem(Json_Array, "title");
cJSON* SelfData = cJSON_GetObjectItem(Json_Array, "selfData");
cJSON* Src = cJSON_Parse(SelfData->valuestring);//selfData数据解析出来为字符串,需要再次解析为json数据才能再次解析
cJSON* Pinyin = cJSON_GetObjectItem(Src, "pinyin");
Json格式文本封装:将多条字符串合成一条json格式数据
const char* client_id = "12345678";
const char* sessionid = "abcdefg";
cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "authCode", client_id);
cJSON_AddStringToObject(root, "sessionId", sessionid);//这里的添加处理字符串以外还可以添加很多类型的数据
char *auth_resp_info = cJSON_Print(root);
printf("%s,%s",auth_resp_info);

C++: 

json json_data;
json_data["Header"] = {{"DSN","5ca439320d7b4adfb965a4442c791c33"}};
json_data["Payload"] = {{"blobData",{{"longitude",""},{"latitude",""}}},{"domain","weather"},{"intent","GetGeneralMsgRequest"}};

最后形成:
 JSON string: {
     "Header": {
         "DSN": "5ca439320d7b4adfb965a4442c791c33"
     },
     "Payload": {
         "blobData": {
             "latitude": "",
             "longitude": ""
         },
         "domain": "weather",
         "intent": "GetGeneralMsgRequest"
     }
 }

或者可以这样:也可以形成上面的数据
json j2 = R"(
 "Header": {
         "DSN": "5ca439320d7b4adfb965a4442c791c33"
     },
     "Payload": {
         "blobData": {
             "latitude": "",
             "longitude": ""
         },
         "domain": "weather",
         "intent": "GetGeneralMsgRequest"
     }
)"_json;
要想打印上面封装的json的数据可以用以字符串的形式:
 json_data.dump(4)

你可能感兴趣的:(网络编程,c语言,json,开发语言)