JSON数据构造及解析详解

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 干货 | JSON数据构造及解析详解

1、JSON格式数据长啥样?

image.png

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.0makefilesvs71中的工程jsoncpp.sln,在jsoncpp-src-0.5.0buildvs71debug路径三个文件下生成对应的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)自己开发时候,只需要包含:includejson下的头文件,和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;
}
AI 代码解读

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;
}
AI 代码解读

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;
}
AI 代码解读

6、Json解析源码

下载地址:

http://download.csdn.net/detail/wojiushiwo987/8870855

7、运行结果示意:

后记:

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


作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/46757751

相关文章
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
128 83
数据大爆炸:解析大数据的起源及其对未来的启示
数据大爆炸:解析大数据的起源及其对未来的启示
122 15
数据大爆炸:解析大数据的起源及其对未来的启示
深度解析淘宝商品详情API接口:解锁电商数据新维度,驱动业务增长
淘宝商品详情API接口,是淘宝开放平台为第三方开发者提供的一套用于获取淘宝、天猫等电商平台商品详细信息的应用程序接口。该接口涵盖了商品的基本信息(如标题、价格、图片)、属性参数、库存状况、销量评价、物流信息等,是电商企业实现商品管理、市场分析、营销策略制定等功能的得力助手。
Python爬取某云热歌榜:解析动态加载的歌曲数据
Python爬取某云热歌榜:解析动态加载的歌曲数据
处理从API返回的JSON数据时返回Unicode编码字符串怎么处理
在处理API返回的JSON数据时,遇到类似`\u7f51\u7edc\u8fde\u63a5\u9519\u8bef`的Unicode编码字符串,可使用JavaScript内置方法转换为可读文字。主要方法包括:1. 使用`JSON.parse`自动解析;2. 使用`decodeURIComponent`和`escape`组合解码;3. 在API调用中直接处理响应数据。这些方法能有效处理多语言内容,确保正确显示非ASCII字符。
淘宝商品评论数据API接口详解及JSON示例返回
淘宝商品评论数据API接口是淘宝开放平台提供的一项服务,旨在帮助开发者通过编程方式获取淘宝商品的评论数据。这些数据包括评论内容、评论时间、评论者信息、评分等,对于电商分析、用户行为研究、竞品分析等领域都具有极高的价值。
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
18 0
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
198 12
深度解析:利用商品详情 API 接口实现数据获取与应用
在电商蓬勃发展的今天,数据成为驱动业务增长的核心。商品详情API接口作为连接海量商品数据的桥梁,帮助运营者、商家和开发者获取精准的商品信息(如价格、描述、图片、评价等),优化策略、提升用户体验。通过理解API概念、工作原理及不同平台特点,掌握获取权限、构建请求、处理响应和错误的方法,可以将数据应用于商品展示、数据分析、竞品分析和个性化推荐等场景,助力电商创新与发展。未来,随着技术进步,API接口将与人工智能、大数据深度融合,带来更多变革。
69 3

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等