在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),有時(shí)候需要將C語(yǔ)言中的JSON格式數(shù)據(jù)轉(zhuǎn)換成XML格式。下面我們來講解一下如何實(shí)現(xiàn)這一過程。
首先需要下載libxml2庫(kù),該庫(kù)提供了很多API函數(shù)用于XML文檔的創(chuàng)建、解析、讀寫等操作。
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlstring.h>
#include <stdlib.h>
#include <stdio.h>
#include <jansson.h>
// 定義將JSON格式數(shù)據(jù)轉(zhuǎn)換成XML格式的函數(shù)
void json_to_xml(json_t * json, xmlNodePtr root){
if(!json_is_object(json) || !root){
printf("json or root is null.\n");
return;
}
xmlNodePtr node;
// 遍歷JSON對(duì)象中的鍵值對(duì)
const char * key;
json_t * value;
json_object_foreach(json, key, value){
if(json_is_object(value)){
// 如果是對(duì)象,則新增一個(gè)元素
node = xmlNewChild(root, NULL, BAD_CAST key, NULL);
// 遞歸調(diào)用json_to_xml函數(shù)
json_to_xml(value, node);
}else if(json_is_array(value)){
// 如果是數(shù)組
node = xmlNewChild(root, NULL, BAD_CAST key, NULL);
size_t i;
for( i = 0; i< json_array_size(value); ++i ) {
// 遍歷數(shù)組元素
json_t * array_node = json_array_get(value, i);
// 新增一個(gè)元素
xmlNodePtr child = xmlNewChild(node, NULL, BAD_CAST "item", NULL);
// 遞歸調(diào)用json_to_xml函數(shù)
json_to_xml( array_node, child );
}
}else{
// 如果是字符串、數(shù)字、布爾類型等基本類型
xmlNewChild(root, NULL, BAD_CAST key, BAD_CAST json_string_value(value));
}
}
}
int main(){
// 解析JSON字符串
const char *json_str = "{\"person\":{\"name\":\"Tom\",\"age\":18,\"hobby\":[\"reading\",\"swimming\",\"traveling\"]}}";
json_error_t error;
json_t * json = json_loads(json_str, 0, &error);
if(!json){
printf("json_loads error,line %d:%s\n", error.line, error.text);
return 1;
}
// 創(chuàng)建根節(jié)點(diǎn)
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
// 調(diào)用json_to_xml函數(shù)進(jìn)行格式轉(zhuǎn)換
json_to_xml(json, root_node);
// 輸出XML格式的數(shù)據(jù)
xmlChar *s;
int size;
xmlDocDumpFormatMemory(doc, &s, &size, 1);
printf("XML format:\n%s", s);
xmlFree(s);
// 釋放資源
json_decref(json);
xmlFreeDoc(doc);
return 0;
}
在本例中,我們創(chuàng)建了一個(gè)JSON對(duì)象,將其轉(zhuǎn)換成XML格式并輸出結(jié)果。
需要注意的是,在轉(zhuǎn)換過程中,如果JSON對(duì)象中包含了嵌套的對(duì)象或數(shù)組,需要使用遞歸的方式進(jìn)行轉(zhuǎn)換。