JSON数据构造及解析详解

1、JSON格式数据长啥样?

2、JSON简介

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

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

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

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

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

5)数据量: 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文件。

3)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、运行结果示意:

后记:

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

答:

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

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

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

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

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/46757751

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 01:10:15

JSON数据构造及解析详解的相关文章

ini格式数据生成与解析详解

ini格式数据生成与解析详解 1.ini格式数据长啥样? 2.ini格式数据简介 INI文件的命名来源,是取自英文"初始(Initial)"的首字缩写,正与它的用途--初始化程序相应. 有时候,INI文件也会以不同的扩展名,如".cfg".".conf"(在Linux系统中也常用到).或是".txt"代替(从辨识度的角度,不建议使用). 3.ini格式数据适用场景 INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单

android Json解析详解

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为– Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.JSON相对于XML来讲,数据的体积小 4.JSON与JavaScript的交互更加方便

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,

数据解析详解

1.什么是JSON数据. { 1.JSON:是一种轻量级的传输数据格式,用于数据交互. JSON是javascript语言的一个子集.javascript是个脚本语言(不需要编译),用来给HTML增加动态功能. javascript和java没有半毛钱的关系! 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外). 语法规则: <1> 数据以键值的方式保存; 键(key)必须用双引号("key"),与键值之间以':'分隔; {"name&q

(转)MVC 3 数据验证 Model Validation 详解

继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客

Android 数据加密算法 Des,Base64详解

一,DES加密: 首先网上搜索了一个DES加密算法工具类: import java.security.*;import javax.crypto.*; public class DesHelper { private static String strDefaultKey = "national";          private Cipher encryptCipher = null;          private Cipher decryptCipher = null;  

nginx学习三 nginx配置项解析详解及代码实现

nginx配置项解析详解及代码实现 0回顾 在上一节,用nginx简单实现了一个hello world程序:当我们在浏览器中输入lochost/hello ,浏览器就返回:hello world.为什么会这样呢,简单一点说就是当我们请求访问hello这个服务,nginx就会看配置文件中是否有,如果有,根据具体的handler处理后把处理的结果返回给用户,没有就返回not found. location /hello { test_hello ;//无参数的配置 这其实是一个简单的配置.这节我们来

&lt;转&gt;ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

MVC 3 数据验证 Model Validation 详解 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客户端js以后,也会执行服务端验证,所以大大提高了我们的开发进度.今天我们就一起以一个初学者的身份来进入数据验证的殿堂. 首先,

IA-32指令解析详解

IA-32指令解析详解 0x00 前言 这段时间忙于考试,信息论和最优化,还有算法分析,有点让人头大.期间花了几天看SEH机制,能明白个大概,但是对于VC++对于SHE的包装似乎还是不是很明白,发现逆向工程核心原理对于这段写的太简单,至于加密与解密则是模棱两可,软件加密技术内幕倒是详解了,可是太老了,代码又是汇编写的总是编译不通过.真是让人难受!本来想写一篇SEH详解,但是基于以上原因暂时搁置.这两天看了逆向核心原理关于IA-32指令解析的内容,发现还是挺有意思,遂记录下来. 0x01 何谓IA