JsonCpp第二课不同数据类型的读取-创新互联

1)基本数据类型的读取
{
 "name": "fengyuzaitu",
 "age": 29.5,
 "married": false,
 "utcsecond": 1548745708,
 "utcmilisecond":1548745708000
}

在灵川等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站设计 网站设计制作按需设计,公司网站建设,企业网站建设,品牌网站设计,成都全网营销,成都外贸网站建设,灵川网站建设费用合理。

 std::ifstream ifs;
 ifs.open("testdata.json", std::ios::binary);
 Json::Reader reader(Json::Features::strictMode());
 Json::Value root;
 if (NULL == reader.parse(ifs, root))
 {
  ifs.close();
  return;
 }
 ifs.close();

 if (!root["name"].isString()) return;
 if (!root["age"].isDouble()) return;
 if (!root["married"].isBool()) return;
 if (!root["utcsecond"].isInt()) return;
 if (!root["utcmilisecond"].isInt64()) return;
 
 std::string strName = root["name"].asString();
 double dAge = root["age"].asDouble();
 bool bMarried = root["married"].asBool();
 int32_t nUtcSecond = root["utcsecond"].asInt();
 int64_t nUtcMiliSecond = root["utcmilisecond"].asInt64();


2)字符串数组
{
   "success":false,
   "toReturn":[
       {
           "createTime":"20080806114526000+0800",
           "createUser":"张三"
       },
       {
           "createTime":"20080806114526000+0801",
           "createUser":"李四"
       }
   ],
   "total":2
}

 std::string strTotalNumber = root["total"].asString();
 Json::Value subValue = root["toReturn"];
 if (subValue.isNull()) return;

 size_t count = subValue.size();
 for (size_t i = 0; i < count; i++)
 {
  std::string strCreateTime = subValue[i]["createTime"].asString();
  std::string strCreateUser = subValue[i]["createUser"].asString();
 }

3)数据内嵌json文本

一般情况下如下是一个正常的json文本

{
   "msg":{
       "absTime":1521699455000,
       "ext":{"vehicleColor":"A","monitorId":"85ee85b052dd228a08494e11858060f4"}
   },
   "systemMessage":"1"
}

但是如下,将ext的内容通过双引号包含,变成了一个字符串,解析就需要特别注意

文本内容:
{
"msg":
 {
"absTime": 1521699455000,
"ext": "{\"vehicleColor\":\"A\",\"monitorId\":\"85ee85b052dd228a08494e11858060f4\"}"
 },
"systemMessage": "1"
}内存查看
{
"msg":
 {
"absTime": 1521699455000,
"ext": "{\"vehicleColor\":\"A\",\"monitorId\":\"85ee85b052dd228a08494e11858060f4\"}"
 },
"systemMessage": "1"
}
通过转义来区分双引号,第一步获取到ext对应的字符串,然后重新解析该字符串
 Json::Value msg;
 Json::Reader readerMsg(Json::Features::strictMode());
 if(NULL == readerMsg.parse(strMsg, msg) return;

 std::string strExt = msg["ext"].asString();

 Json::Value ext;
 Json::Reader readerExt(Json::Features::strictMode());
 if (readerer.parse(strExt, ext))
 {
  std::string strColor = ext["vehicleColor"].asString();
  std::string strMonitorId = ext["monitorId"].asString();
 }

注意:提示字符串中字符无效
jsoncpp 在处理 UTF-8 编码的字符串是没有问题,意思是可以正确的解析出键值对,在VS调试情况下,返回的字符串如果包含中文,会提示:字符串中字符无效,这是因为在VS调试过程中,只支持GBK编码的中文,因此如果需要进行字符串的查看,观察字符串的中文含义,可以先将字符串从UTF-8编码转换为GBK编码,然后就可以进行变量的监视提供UTF-8转GBK
 
std::string UTF8ToGBK(const char* szUTF8)
{
      int len = MultiByteToWideChar(CP_UTF8, 0, szUTF8, -1, NULL, 0);
      wchar_t* wstr = new wchar_t[len + 1];
      memset(wstr, 0, len + 1);
      MultiByteToWideChar(CP_UTF8, 0, szUTF8, -1, wstr, len);
      len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
      char* pszStr = new char[len + 1];
      memset(pszStr, 0, len + 1);
      WideCharToMultiByte(CP_ACP, 0, wstr, -1, pszStr, len, NULL, NULL);
      if (wstr) delete[] wstr;
      std::string str = pszStr;
      delete[] pszStr;
      return str;
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:JsonCpp第二课不同数据类型的读取-创新互联
链接URL:http://scyanting.com/article/dhoihj.html