zoukankan      html  css  js  c++  java
  • c++ JsonCpp Parse对Json字符串解析转换判断的补充 Json格式验证

    最近在使用JsonCpp的时候,需要判断当前字符串是否为正确的Json格式,但是Jsoncpp对字符串进行认为是正确的json数据,导致获取的时候出错

    添加一个验证的方法,在转换之前,提前验证数据是否正确,正确之后才能进行转换

      1 bool IsJsonIllegal(const char *jsoncontent)
      2 {
      3     std::stack<char> jsonstr;
      4     const char *p = jsoncontent;
      5     char startChar = jsoncontent[0];
      6     char endChar = '';
      7     bool isObject = false;//防止 {}{}的判断
      8     bool isArray = false;//防止[][]的判断
      9 
     10     while (*p != '')
     11     {
     12         endChar = *p;
     13         switch (*p)
     14         {
     15         case '{':
     16             if (!isObject)
     17             {
     18                 isObject = true;
     19             }
     20             else  if (jsonstr.empty())//对象重复入栈
     21             {
     22                 return false;
     23             }
     24             jsonstr.push('{');
     25             break;
     26         case '"':
     27             if (jsonstr.empty() || jsonstr.top() != '"')
     28             {
     29                 jsonstr.push(*p);
     30             }
     31             else
     32             {
     33                 jsonstr.pop();
     34             }
     35             break;
     36         case '[':
     37             if (!isArray)
     38             {
     39                 isArray = true;
     40             }
     41             else  if (jsonstr.empty())//数组重复入栈
     42             {
     43                 return false;
     44             }
     45             jsonstr.push('[');
     46             break;
     47         case ']':
     48             if (jsonstr.empty() || jsonstr.top() != '[')
     49             {
     50                 return false;
     51             }
     52             else
     53             {
     54                 jsonstr.pop();
     55             }
     56             break;
     57         case '}':
     58             if (jsonstr.empty() || jsonstr.top() != '{')
     59             {
     60                 return false;
     61             }
     62             else
     63             {
     64                 jsonstr.pop();
     65             }
     66             break;
     67         case '\'://被转义的字符,跳过
     68             p++;
     69             break;
     70         default:
     71             ;
     72         }
     73         p++;
     74     }
     75 
     76     if (jsonstr.empty())
     77     {
     78         //确保是对象或者是数组,之外的都不算有效 
     79         switch (startChar)//确保首尾符号对应
     80         {
     81         case  '{':
     82         {
     83             if (endChar = '}')
     84             {
     85                 return true;
     86             }
     87             return false;
     88         }
     89         case '[':
     90         {
     91             if (endChar = ']')
     92             {
     93                 return true;
     94             }
     95             return false;
     96         }
     97         default:
     98             return false;
     99         }
    100 
    101         return true;
    102     }
    103     else
    104     {
    105         return false;
    106     }
    107 }
  • 相关阅读:
    LeetCode【125. 验证回文串】
    LeetCode【122. 买卖股票的最佳时机 II】
    LeetCode【121. 买卖股票的最佳时机】
    LeetCode【119. 杨辉三角 II】
    LeetCode【118. 杨辉三角】
    LeetCode【112. 路径总和】
    PAT1024
    PAT1020
    PAT1018
    PAT1017
  • 原文地址:https://www.cnblogs.com/mingxh/p/9552583.html
Copyright © 2011-2022 走看看