0
点赞
收藏
分享

微信扫一扫

JSON数据构造及解析详解




JSON数据构造及解析详解

1、JSON格式数据长啥样?




JSON数据构造及解析详解_Json生成



2、JSON简介


JSON(Javascript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。


Json和XML相比可谓不相上下,一边是简单的语法,一边是规范的标签形式,很难分出胜负。

XML天生有很好的可扩展性,Json也有。

XML有丰富的编码工具,Json也有提供,但是XML要输入很多结构字符。

4)解码难度:凡是可扩展的数据结构,解析起来都很困难。

Json具有轻小的特点,降低了数据传输量。

3、JSON适用场景


JSON始于JS,本身就是一种轻量级数据交互类型http://json.org/,所以JSON自然适用于进行数据交互的场景。典型的是Ajax中实现异步加载,因为前段页面已经加载,剩下需要的是真实的数据。
同样的,为了支持跨平台、数据安全等的web service也是一种数据传输,自然也可以使用。




4、常用开源的CPPJson注意事项?


1)下载地址:https://github.com/open-source-parsers/jsoncpp


2) 编译对应下载路径的jsoncpp-src-0.5.0\makefiles\vs71中的工程jsoncpp.sln,在jsoncpp-src-0.5.0\build\vs71\debug路径三个文件下生成对应的jsontest.exe、json_vc71_libmtd.lib、test_lib_json.exe文件。


json_vc71_libmtd.lib即为我们第三方的库,可供开发使用。


注意:编译的时候需要修改以下两个地方:


(1)lib_json工程属性-->配置属性-->C/C++-->代码生成 运行库改为“多线程调试DLL(/MDd)";


(2)lib_json工程属性-->配置属性-->库管理器-->常规 忽略特定库中改为“msvcprtd.lib;%(IgnoreSpecificDefaultLibraries)”。


以避免编译错误。


4)自己开发时候,只需要包含:include\json下的头文件,和3)生成的json_vc71_libmtd.lib库即可。



5、构造Json格式数据


//1. json格式化数据,输出到控制台和文件
void JsonInsert()
{
//根节点
Json::Value root;
Json::FastWriter fastWriter; //可以把Json::Value对象写入到字符串流或者文件中。
Json::StyledWriter styleWriter;

//根节点属性
root["uploadid"] = Json::Value("UP0000011");
root["code"] = Json::Value(58);
root["msg"] = Json::Value("This is test msg!");


Json::Value files;
files["code"] = "00";
files["msg"] = "first00_msg";
files["filename"] = "1D_16-35_1.jpg";
files["filesize"] = "196690";
files["width"] = "1024";
files["height"] = "682";

Json::Value images;
for (int i = 0; i < 3; ++i)
{
images[i]["url"] = "fmn061/20150704";
images[i]["type"] = "large";
images[i]["width"] = 720 + i;
images[i]["height"] = 490 + i;
files["image"].append(images[i]); //插入数组
}

//子节点挂载到根节点上
root["files"] = Json::Value(files);

//**直接输出
cout << "FastWriter:" << endl;
std::string json_file = fastWriter.write(root);
cout << json_file << endl << endl;

//**缩进输出
cout << "StyledWriter:" << endl;

std::string style_json_file = styleWriter.write(root);
cout << style_json_file << endl << endl;

//输出到文件
ofstream ofs(INSERT_FILE_NAME);
if (ofs.is_open())
{
ofs << style_json_file; //将缩进格式输出到文件.
}

ofs.close();
cout << "insert " << INSERT_FILE_NAME << " successful!" << endl;
}



6、解析Json格式数据



1)解析Json串


//0.解析串
int ParseJsonFromString()
{
const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";

Json::Reader reader;
Json::Value root;
if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
int code = root["code"].asInt(); // 访问节点,code = 100

cout << "upload_id = " << upload_id << "\t code =" << code << endl;
}
return 0;
}


2)解析Json文件


//2.解析1插入的文件
int ParseJsonFromFile(const char* pszFileName)
{
// 解析json用Json::Reader
Json::Reader reader;
// Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
Json::Value root;

std::ifstream is;
is.open (pszFileName, std::ios::binary );

if (reader.parse(is, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string strUpload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
int iCode = root["code"].asInt(); // 访问节点,code = 100
std::string strMsg = root["msg"].asString();

cout << "-upload_id = " << strUpload_id << "\t iCode = " << iCode << "\tmsg = " << strMsg << endl;

std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
{
// 得到"files"的数组个数
int file_size = root["files"].size();
cout << "-file_size = " << file_size << endl;


// 遍历数组

std::string val_code = root["files"]["code"].asString();
std::string val_msg = root["files"]["msg"].asString();
std::string val_filename = root["files"]["filename"].asString();
std::string val_filesize = root["files"]["filesize"].asString();
std::string val_width = root["files"]["width"].asString();
std::string val_height = root["files"]["height"].asString();

cout << "--code =" << val_code << "\t msg=" << val_msg << "\t filename=" << val_filename \
<< "\t filesize=" << val_filesize << "\t width" << val_width << "\t height =" << val_height << endl << endl;

Json::Value val_image = root["files"]["image"];
int image_size = val_image.size();
cout << "image_size =" << image_size << endl;

for(int j = 0; j < image_size; ++j)
{
std::string url = val_image[j]["url"].asString();
std::string type = val_image[j]["type"].asString();
int width = val_image[j]["width"].asInt();
int height = val_image[j]["height"].asInt();

cout << "--url =" << url << "\t type =" << type \
<< "\t width =" << width << "\t height =" << height << endl;

}

}
}
is.close();
return 0;
}


6、Json解析源码


7、运行结果示意:



JSON数据构造及解析详解_数据_02




后记:


1、有人可能会说,Json解析包括cppJson的使用方法,一搜一大把,为什么还要重复?


答:
1)别人的终究是别人的,别人的都是之前整理的。自己着实在前人的基础上,去下载、新建工程、单步调试代码、按照自己的想法构造Json,这是我想要的。


2)有一个通盘的认识,不至于项目使用时候“临阵报佛脚”。


2、可能还不够深入,后续根据项目开发会继续总结和更新博文。


2014-7-4 pm21:29 思于家中床前


作者:铭毅天下



举报

相关推荐

0 条评论