zoukankan      html  css  js  c++  java
  • c++实现Xml和json互转【转】

    https://blog.csdn.net/kfy2011/article/details/51774242 

    1、下载c语言的cJson库源码,库很小,只有两个文件cJSON.c和cJSON.h。下载地址:https://sourceforge.net/projects/cjson/

    2、c++实现Xml和json互转

    2.1、头文件

    1. #include "XmlJsonTransfer.h"  
    2. //#include "cmsDebug.h"  
    3. #include "WebSocket/src/cJSON.h"  
    4.   
    5. #include <stdlib.h>    
    6. #include <string.h>    
    7. #include <stdio.h>    
    8. #include <assert.h>    
    9. #include <time.h>  
    10. #include <iostream>    
    11. using namespace std;  


    2.2、xml转json

    1. // 依赖cJSon,递归  
    2. /*  
    3. <doc><a1="1" a2="2">123</a></doc> 转 {"doc": {"a": {"-a1": "1","-a2": "2","#text": "123"}}}  
    4. */  
    5. string Xml2Json(string strXml)  
    6. {  
    7.     string pNext = strXml;  
    8.     cJSON * reJson = cJSON_CreateObject();  
    9.     cJSON * jsonArray = cJSON_CreateArray();  
    10.     string strArrayKey = "";  
    11.     int nPos = 0;  
    12.   
    13.     while ((nPos = pNext.find("<")) >= 0)  
    14.     {  
    15.         // 获取第一个节点,如:<doc><a1="1" a2="2">123</a></doc>  
    16.         int nPosS = pNext.find("<");  
    17.         int nPosE = pNext.find(">");  
    18.         if (nPosS 0 || nPosE 0)  
    19.         {  
    20.             printf("key error!");  
    21.         }  
    22.   
    23.         string strKey = pNext.substr(nPosS+1, nPosE-nPosS-1);  
    24.         // 解释属性,如:<a1="1" a2="2">  
    25.         cJSON * jsonVal = NULL;  
    26.         if ((nPos = strKey.find("=")) > 0)  
    27.         {  
    28.             jsonVal = cJSON_CreateObject();  
    29.             int nPos = strKey.find(" ");  
    30.             string temp = strKey.substr(nPos+1);  
    31.             strKey = strKey.substr(0, nPos);  
    32.             while((nPos = temp.find("=")) > 0)  
    33.             {  
    34.                 int nPos1 = temp.find("=");  
    35.                 int nPos2 = temp.find("" ", nPos1 + 1);  
    36.   
    37.                 string strSubKey = temp.substr(0, nPos1);  
    38.                 string strSubVal = temp.substr(nPos1+1);  
    39.                 if (nPos2 > 0)  
    40.                     strSubVal = temp.substr(nPos1+1, nPos2-nPos1-1);  
    41.   
    42.                 // 去除转义字符 "   
    43.                 if ((int)(nPos = strSubVal.find(""")) >= 0)  
    44.                 {  
    45.                     int nEnd = strSubVal.find("\", nPos+1);  
    46.                     strSubVal = strSubVal.substr(nPos+1, nEnd-nPos-1);  
    47.                 }  
    48.                 cJSON_AddItemToObject(jsonVal, ("-" + strSubKey).c_str(), cJSON_CreateString(strSubVal.c_str()));  
    49.   
    50.                 if (nPos2 0)  
    51.                     break;  
    52.   
    53.                 temp = temp.substr(nPos2+2);  
    54.             }  
    55.         }  
    56.   
    57.         int nPosKeyE = pNext.find("</" + strKey + ">");  
    58.         if (nPosKeyE 0)  
    59.         {  
    60.             printf("key error!");  
    61.         }  
    62.         // 获取节点内容,如<a1="1" a2="2">123</a> 或 123  
    63.         string strVal = pNext.substr(nPosE+1, nPosKeyE-nPosE-1);  
    64.         if ((nPos = strVal.find("<")) >= 0)  
    65.         {  
    66.             // 包含子节点,如<a1="1" a2="2">123</a>  
    67.             strVal = Xml2Json(strVal);  
    68.   
    69.             if (jsonVal)  
    70.             {  
    71.                 if (strVal != "")  
    72.                     cJSON_AddItemToObject(jsonVal, "#text", cJSON_Parse(strVal.c_str()));  
    73.             }  
    74.             else  
    75.             {  
    76.                 jsonVal = cJSON_Parse(strVal.c_str());  
    77.             }  
    78.         }  
    79.         else  
    80.         {  
    81.             // 不包含子节点,如123  
    82.             if (jsonVal)  
    83.             {  
    84.                 if (strVal != "")  
    85.                     cJSON_AddItemToObject(jsonVal, "#text", cJSON_CreateString(strVal.c_str()));  
    86.             }  
    87.             else  
    88.             {  
    89.                 jsonVal = cJSON_CreateString(strVal.c_str());  
    90.             }  
    91.         }  
    92.   
    93.         // 获取下一个节点  
    94.         pNext = pNext.substr(nPosKeyE + strKey.size() + 3);  
    95.   
    96.         // 根据下一节点判断是否为数组  
    97.         int nPosNext = pNext.find("<");  
    98.         int nPosNextSame = pNext.find("<" + strKey + ">");  
    99.         if (strArrayKey != "" || (nPosNext>=0 && nPosNextSame>=0 && nPosNext==nPosNextSame))  
    100.         {  
    101.             // 数组  
    102.             cJSON_AddItemToArray(jsonArray, jsonVal);  
    103.             strArrayKey = strKey;  
    104.         }  
    105.         else  
    106.         {  
    107.             // 非数组  
    108.             cJSON_AddItemToObject(reJson, strKey.c_str(), jsonVal);  
    109.         }  
    110.     }  
    111.       
    112.       
    113.     if (strArrayKey != "")  
    114.     {  
    115.         cJSON_AddItemToObject(reJson, strArrayKey.c_str(), jsonArray);  
    116.     }  
    117.   
    118.     string strJson = cJSON_Print(reJson);  
    119.       
    120.     if(reJson)  
    121.     {  
    122.         cJSON_Delete(reJson);  
    123.         reJson = NULL;  
    124.     }  
    125.   
    126.     return strJson;  
    127. }  


    2.3、json转xml

    1. // 依赖cJSon,递归  
    2. /*  
    3. {"doc": {"a": {"-a1": "1","-a2": "2","#text": "123"}}}  转 <doc><a1="1" a2="2">123</a></doc>  
    4. */  
    5. string Json2Xml(string strJson)  
    6. {  
    7.     string strXml = "";  
    8.     cJSON *root = cJSON_Parse(strJson.c_str());  
    9.     if (!root)  
    10.     {  
    11.         printf("strJson error!");  
    12.         return "";  
    13.     }  
    14.           
    15.     cJSON *pNext = root->child;  
    16.     if (!pNext)  
    17.     {  
    18.         return strJson;  
    19.     }  
    20.   
    21.     int nPos = 0;  
    22.     while (pNext)  
    23.     {  
    24.         string strChild = cJSON_Print(pNext);  
    25.         string strVal = Json2Xml(strChild);  
    26.   
    27.         if (pNext->string != NULL)  
    28.         {  
    29.             string strKey = pNext->string;  
    30.             if ((nPos=strKey.find("-")) == 0)  
    31.             {  
    32.                 // 属性项  
    33.                 strXml.append(" ");  
    34.                 strXml.append(strKey.substr(1));  
    35.                 strXml.append("=");  
    36.                 strXml.append(strVal);  
    37.   
    38.                 if (pNext->next == NULL)  
    39.                     strXml.append(">");  
    40.             }  
    41.             else if ((nPos=strKey.find("#")) == 0)  
    42.             {  
    43.                 // 值  
    44.                 strXml.append(">");  
    45.                 strXml.append(strVal);  
    46.             }  
    47.             else if ((int)(strVal.find("=")) > 0 /*&& (int)(strVal.find("<")) 0*/)  
    48.             {  
    49.                 // 包含属性项的键值对  
    50.                 strXml.append("<" + strKey);  
    51.                 strXml.append(strVal);  
    52.                 strXml.append("</" + strKey + ">");  
    53.             }  
    54.             else  
    55.             {  
    56.                 // 修正底层无键的值数组的键,如:把<JUAN_XJ_preKey>123</JUAN_XJ_preKey>中的JUAN_XJ_preKey修正  
    57.                 if ((int)strVal.find("JUAN_XJ_preKey") >= 0)  
    58.                 {  
    59.                     replace_all(strVal, "JUAN_XJ_preKey", strKey);  
    60.                     strXml.append(strVal);  
    61.                 }  
    62.                 else  
    63.                 {  
    64.                     strXml.append("<" + strKey + ">");  
    65.                     strXml.append(strVal);  
    66.                     strXml.append("</" + strKey + ">");  
    67.                 }  
    68.             }  
    69.         }  
    70.         else  
    71.         {  
    72.             // 不包含键的值数组, 如:["123", "456"],暂时转为<JUAN_XJ_preKey>123</JUAN_XJ_preKey>  
    73.             string strPreKey = "JUAN_XJ_preKey";  
    74.             strXml.append("<" + strPreKey + ">");  
    75.             strXml.append(strVal);  
    76.             strXml.append("</" + strPreKey + ">");  
    77.         }  
    78.   
    79.         pNext = pNext->next;  
    80.     }  
    81.   
    82.     return strXml;  
    83. }  

    2.4、辅助函数

      1. // 替换字符串  
      2. string&  replace_all(string& str, const string& old_value, const string& new_value)       
      3. {       
      4.     while(true)     
      5.     {       
      6.         string::size_type   pos(0);       
      7.         if((pos=str.find(old_value)) != string::npos)       
      8.             str.replace(pos,old_value.length(),new_value);       
      9.         else     
      10.             break;       
      11.     }       
      12.     return   str;       
      13. }  



  • 相关阅读:
    近期简单题炸分总结
    传输层中的端口号
    TCP的三次握手与四次挥手
    ppq的面试题总结
    一个C++源文件从文本到可执行文件经历的过程
    C++中的&符号的运用:引用、取地址和右值引用
    C++中的拷贝构造、赋值构造函数
    C++中的虚函数
    函数指针与回调函数
    C++中的智能指针
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/8777658.html
Copyright © 2011-2022 走看看