Json数据构造和解析详解(Json格式数据===Java对象)

备注:此博客为转载,转载地址请点击此处


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. //1. json格式化数据,输出到控制台和文件
  2. void JsonInsert()
  3. {
  4. //根节点
  5. Json::Value root;
  6. Json::FastWriter fastWriter; //可以把Json::Value对象写入到字符串流或者文件中。
  7. Json::StyledWriter styleWriter;
  8. //根节点属性
  9. root[ "uploadid"] = Json::Value( "UP0000011");
  10. root[ "code"] = Json::Value( 58);
  11. root[ "msg"] = Json::Value( "This is test msg!");
  12. Json::Value files;
  13. files[ "code"] = "00";
  14. files[ "msg"] = "first00_msg";
  15. files[ "filename"] = "1D_16-35_1.jpg";
  16. files[ "filesize"] = "196690";
  17. files[ "width"] = "1024";
  18. files[ "height"] = "682";
  19. Json::Value images;
  20. for ( int i = 0; i < 3; ++i)
  21. {
  22. images[i][ "url"] = "fmn061/20150704";
  23. images[i][ "type"] = "large";
  24. images[i][ "width"] = 720 + i;
  25. images[i][ "height"] = 490 + i;
  26. files[ "image"].append(images[i]); //插入数组
  27. }
  28. //子节点挂载到根节点上
  29. root[ "files"] = Json::Value(files);
  30. //**直接输出
  31. cout << "FastWriter:" << endl;
  32. std:: string json_file = fastWriter.write(root);
  33. cout << json_file << endl << endl;
  34. //**缩进输出
  35. cout << "StyledWriter:" << endl;
  36. std:: string style_json_file = styleWriter.write(root);
  37. cout << style_json_file << endl << endl;
  38. //输出到文件
  39. ofstream ofs(INSERT_FILE_NAME);
  40. if (ofs.is_open())
  41. {
  42. ofs << style_json_file; //将缩进格式输出到文件.
  43. }
  44. ofs.close();
  45. cout << "insert " << INSERT_FILE_NAME << " successful!" << endl;
  46. }

6、解析Json格式数据

1)解析Json串

  
  
  1. //0.解析串
  2. int ParseJsonFromString()
  3. {
  4. const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
  5. Json::Reader reader;
  6. Json::Value root;
  7. if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
  8. {
  9. std:: string upload_id = root[ "uploadid"].asString(); // 访问节点,upload_id = "UP000000"
  10. int code = root[ "code"].asInt(); // 访问节点,code = 100
  11. cout << "upload_id = " << upload_id << "\t code =" << code << endl;
  12. }
  13. return 0;
  14. }



2)解析Json文件

  
  
  1. //2.解析1插入的文件
  2. int ParseJsonFromFile(const char* pszFileName)
  3. {
  4. // 解析json用Json::Reader
  5. Json::Reader reader;
  6. // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
  7. Json::Value root;
  8. std::ifstream is;
  9. is.open (pszFileName, std::ios::binary );
  10. if (reader.parse(is, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
  11. {
  12. std:: string strUpload_id = root[ "uploadid"].asString(); // 访问节点,upload_id = "UP000000"
  13. int iCode = root[ "code"].asInt(); // 访问节点,code = 100
  14. std:: string strMsg = root[ "msg"].asString();
  15. cout << "-upload_id = " << strUpload_id << "\t iCode = " << iCode << "\tmsg = " << strMsg << endl;
  16. std:: string code;
  17. if (!root[ "files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
  18. {
  19. // 得到"files"的数组个数
  20. int file_size = root[ "files"].size();
  21. cout << "-file_size = " << file_size << endl;
  22. // 遍历数组
  23. std:: string val_code = root[ "files"][ "code"].asString();
  24. std:: string val_msg = root[ "files"][ "msg"].asString();
  25. std:: string val_filename = root[ "files"][ "filename"].asString();
  26. std:: string val_filesize = root[ "files"][ "filesize"].asString();
  27. std:: string val_width = root[ "files"][ "width"].asString();
  28. std:: string val_height = root[ "files"][ "height"].asString();
  29. cout << "--code =" << val_code << "\t msg=" << val_msg << "\t filename=" << val_filename \
  30. << "\t filesize=" << val_filesize << "\t width" << val_width << "\t height =" << val_height << endl << endl;
  31. Json::Value val_image = root[ "files"][ "image"];
  32. int image_size = val_image.size();
  33. cout << "image_size =" << image_size << endl;
  34. for( int j = 0; j < image_size; ++j)
  35. {
  36. std:: string url = val_image[j][ "url"].asString();
  37. std:: string type = val_image[j][ "type"].asString();
  38. int width = val_image[j][ "width"].asInt();
  39. int height = val_image[j][ "height"].asInt();
  40. cout << "--url =" << url << "\t type =" << type \
  41. << "\t width =" << width << "\t height =" << height << endl;
  42. }
  43. }
  44. }
  45. is.close();
  46. return 0;
  47. }



6、Json解析源码
7、运行结果示意:


后记:
1、有人可能会说,Json解析包括cppJson的使用方法,一搜一大把,为什么还要重复?
答:
1)别人的终究是别人的,别人的都是之前整理的。自己着实在前人的基础上,去下载、新建工程、单步调试代码、按照自己的想法构造Json,这是我想要的。
2)有一个通盘的认识,不至于项目使用时候“临阵报佛脚”。
2、可能还不够深入,后续根据项目开发会继续总结和更新博文。


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

作者:铭毅天下

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值