jsoncpp 关于 特殊字符解析失败的问题

根本原因是因为在解析此类字符时,对于文字的后半部分解析成了'\\' 。造成了后续的识别错误。

采用的方法是:根据字符前半部分来判断文字类型,对于文字直接获取下半部分

bool
Reader::decodeString( Token &token, std::string &decoded )
{
   decoded.reserve( token.end_ - token.start_ - 2 );
   Location current = token.start_ + 1; // skip '"'
   Location end = token.end_ - 1;      // do not include '"'
   while ( current != end )
   {
      Char c = *current++;
      if ( c == '"' )
         break;
      else if ( c == '\\' )
      {
         if ( current == end )
            return addError( "Empty escape sequence in string", token, current );
         Char escape = *current++;
         switch ( escape )
         {
         case '"': decoded += '"'; break;
         case '/': decoded += '/'; break;
         case '\\': decoded += '\\'; break;
         case 'b': decoded += '\b'; break;
         case 'f': decoded += '\f'; break;
         case 'n': decoded += '\n'; break;
         case 'r': decoded += '\r'; break;
         case 't': decoded += '\t'; break;
         case 'u':
            {
               unsigned int unicode;
               if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
                  return false;
               decoded += codePointToUTF8(unicode);
            }
            break;
         default:
            return addError( "Bad escape sequence in string", token, current );
            
         }
      }
      else
      {
         decoded += c;
         if (c < 0 && current != end)  //此处增加
             decoded += *current++; //此处增加
      }
   }
   return true;
}

bool
Reader::readString()
{
   Char c = 0;
   while ( current_ != end_ )
   {
      c = getNextChar();
      if (c < 0) //增加
      {                                                            //增加
          if(current_ != end_) getNextChar();//增加
          continue;      //增加
      }//增加
      if ( c == '\\' )
         getNextChar();
      else if ( c == '"' )
         break;
   }
   return c == '"';
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中使用jsoncpp库进行JSON解析,你需要按照以下步骤进行设置: 1. 下载jsoncpp库:你可以从jsoncpp的GitHub仓库下载源代码:https://github.com/open-source-parsers/jsoncpp 2. 构建和安装库:根据你的操作系统和编译器,按照jsoncpp的文档说明来构建和安装库。 3. 在你的项目中包含头文件:在你的C++代码中,包含jsoncpp的头文件: ```cpp #include <json/json.h> ``` 4. 解析JSON数据:使用以下代码片段来解析JSON数据: ```cpp // JSON字符串 std::string jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\",\"cars\":[\"Ford\",\"BMW\",\"Fiat\"]}"; // 创建Json::Value对象 Json::Value root; // 解析JSON字符串 Json::CharReaderBuilder reader; std::istringstream iss(jsonString); std::string errors; Json::parseFromStream(reader, iss, &root, &errors); // 获取字段的值 std::string name = root["name"].asString(); int age = root["age"].asInt(); std::string city = root["city"].asString(); const Json::Value cars = root["cars"]; for (unsigned int i = 0; i < cars.size(); ++i) { std::string car = cars[i].asString(); // 处理车辆信息 } ``` 在上面的示例中,我们首先创建一个Json::Value对象来存储解析后的JSON数据。然后,使用Json::CharReaderBuilder和std::istringstream来解析JSON字符串,并将结果存储到Json::Value对象中。之后,我们可以根据需要获取字段的值,将其转换为适当的类型。 请注意,上述示例仅演示了jsoncpp库的基本用法。你可以根据实际需求使用更多的jsoncpp函数和类来处理JSON数据。可以参考jsoncpp的文档和示例代码来了解更多详细用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值