求助 关于C++ 使用Jsoncpp 解析Json文件问题

[复制链接]
查看11 | 回复8 | 2021-1-27 06:05:25 | 显示全部楼层 |阅读模式
在使用Jsoncpp读取一个文件,然后需要提取一个key值的时候,我做了一下判断,这个key值是否存在。
由于这个文件我用在线解析器解析过,这个key是存在的,但是,当我使用Json::value::isMember的时候,返回的时false。
我尝试的直接输出这个文件,发现只能Write出该文件最后一部分,我猜想是否时read的数据有上限?
还是别的原因导致我找不到这个key。
wstringpath1=L"C:\\Users\\Brindy\\AppData\\Local\\Google\\Chrome\\UserData\\Default\\SecurePreferences";
wstringpath2=L"C:\\Users\\Brindy\\AppData\\Roaming\\360se6\\UserData\\Default\\SecurePreferences";
Json::Readerreader;
Json::Valuevalue;
ifstreamfile1(path1);
reader.parse(file1,value,false);
//string*mini=value["meknedonckjndodlanehmlkfjedgplen"].asString;
stringBuffer;
stringstrKey="meknedonckjndodlanehmlkfjedgplen";
if(value.isMember("meknedonckjndodlanehmlkfjedgplen")){
Json::Value::Membersmembers;
members=value[strKey].getMemberNames();
for(Json::Value::Members::iteratorit=members.begin();it!=members.end();++it){
stringtemp_value=*it;
stringvalue_str=value[temp_value].asString();
cout
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
源文件是什么编码
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
源文件时googlechrome的插件文件SecurePreferences
我把这个文件用文本模式打开,然后将内容复制到,网上的在线解析,是可以编译的。
我自己用read然后输出读取出来的value也是由结果的,不是源文件属性的问题。
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊GBK:0xB00xA1,Unicode-16LE:0x4A0x55,Unicode-16BE:0x550x4A,UTF-8:0xE50x950x8A
http://www.json.org
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
仅供参考:#define_UNICODE1
#pragmawarning(disable:43054309)
#pragmacomment(lib,"ole32")
#pragmacomment(lib,"comsupp")
#include
#include
#include
#include
#include
typedef_com_ptr_tIMultiLanguage3Ptr;
intmain(){
CoInitialize(NULL);
{
IMultiLanguage3PtrpML(CLSID_CMultiLanguage,NULL,CLSCTX_INPROC);
chardata[]={0xD6,0xD0,0xCE,0xC4,0xB1,0xE0,0xC2,0xEB};
intisize=sizeof(data);
DetectEncodingInforesult[32];
intresult_count=sizeof(result)/sizeof(result[0]);
HRESULThr=pML->DetectInputCodepage(MLDETECTCP_NONE,0,data,&isize,result,&result_count);
if(!SUCCEEDED(hr))
{
fprintf(stderr,"Failedwith0x%x\n",hr);
CoUninitialize();
returnhr;
}
for(inti=0;iGetCodePageDescription(result.nCodePage,result.nLangID,desc,100);
printf("CP:%d(%S)\n",result.nCodePage,desc);
}
}
CoUninitialize();
return0;
}
//CP:936(ChineseSimplified(GB2312))
//

回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
谢谢,我进一步的做了一下检查,发现在读取的时候,Json::value这个项存储不了从文件中读取的全部数据,有一大部分的数据是丢失了,使用Json::Writer输出出来之后,发现,只有源文件最后的三分之一的部分,而我需要的部分,正好不在这段文件内。
所以我现在在尝试了解value这个容器是怎么申请空间的,寻找无法全部读取的原因。
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose//读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose//不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
voidHexDump(char*buf,intlen,intaddr){
inti,j,k;
charbinstr[80];
for(i=0;i#include
#include
FILE*f;
charbuffer[4096];
intr,a;
voidHexDump(char*buf,intlen,intaddr){
inti,j,k;
charbinstr[80];
for(i=0;i<len;i++){
if(0==(i%16)){
sprintf(binstr,"%08x-",i+addr);
sprintf(binstr,"%s%02x",binstr,(unsignedchar)buf);
}elseif(15==(i%16)){
sprintf(binstr,"%s%02x",binstr,(unsignedchar)buf);
sprintf(binstr,"%s",binstr);
for(j=i-15;j<=i;j++){
sprintf(binstr,"%s%c",binstr,('!'
回复

使用道具 举报

千问 | 2021-1-27 06:05:25 | 显示全部楼层
谢谢,老师的知道。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行