接著,我們需要?jiǎng)?chuàng)建一個(gè)cJSON對(duì)象,使用cJSON_Parse()函數(shù)將json格式數(shù)據(jù)解析為cJSON對(duì)象:
char *json_data = "{\"name\":\"Tom\", \"age\":18}";
cJSON *json_object = cJSON_Parse(json_data);
經(jīng)過(guò)解析后,我們可以得到一個(gè)cJSON對(duì)象,其中包含了json數(shù)據(jù)的各個(gè)屬性和值。接下來(lái),我們需要將cJSON對(duì)象轉(zhuǎn)換為xml格式數(shù)據(jù)。
在轉(zhuǎn)換之前,我們需要先自定義xml的格式,比如:
<person>
<name>Tom</name>
<age>18</age>
</person>
接著,我們可以使用遞歸的方式,遍歷cJSON對(duì)象并將其轉(zhuǎn)換為xml:
void json_to_xml(cJSON *json_object, xmlDocPtr doc, xmlNodePtr node)
{
xmlNodePtr child_node;
xmlNodePtr sub_child_node;
cJSON *item;
cJSON_ArrayForEach(item, json_object)
{
child_node = xmlNewChild(node, NULL, BAD_CAST item->string, NULL);
if(item->type == cJSON_String)
{
xmlNodeSetContent(child_node, BAD_CAST item->valuestring);
}
else if(item->type == cJSON_Number)
{
char str_value[64];
sprintf(str_value, "%d", item->valueint);
xmlNodeSetContent(child_node, BAD_CAST str_value);
}
else if(item->type == cJSON_Array)
{
cJSON *sub_item;
cJSON_ArrayForEach(sub_item, item)
{
sub_child_node = xmlNewChild(child_node, NULL, BAD_CAST item->string, NULL);
json_to_xml(sub_item, doc, sub_child_node);
}
}
else if(item->type == cJSON_Object)
{
json_to_xml(item, doc, child_node);
}
}
}
使用xmlNewChild函數(shù)創(chuàng)建一個(gè)新的子節(jié)點(diǎn),并使用xmlNodeSetContent函數(shù)將內(nèi)容設(shè)置為相應(yīng)的json屬性值。如果屬性類型為數(shù)組或?qū)ο螅覀冃枰褂眠f歸的方式處理。
最后,我們可以調(diào)用上述函數(shù)將cJSON對(duì)象轉(zhuǎn)換為xml,代碼如下:
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
json_to_xml(json_object, doc, root_node);
經(jīng)過(guò)上述步驟,我們就成功將json格式數(shù)據(jù)轉(zhuǎn)換為xml格式數(shù)據(jù)。