Json使用教程

Json使用教程使用第三方静态库的步骤:1、编译文件生成静态库。2、把相关的.h文件放入D:\VS2005安装目录\VC\include路径下。3、把相应的.lib文件放在D:\VS2005安装目录\VC\lib路径下。在使用中只需要将json.rar中的文件添加(并包含)到项目中链接:在需要使用Json的文件中添加json.h的头文件即可使用了使用教程如下:JsonCpp是一…

大家好,又见面了,我是你们的朋友全栈君。

Json使用教程

使用第三方静态库的步骤:
1、编译文件生成静态库。
2、把相关的.h文件放入D:\VS2005安装目录\VC\include路径下。
3、把相应的.lib文件放在D:\VS2005安装目录\VC\lib路径下。
在使用中只需要将json.rar中的文件添加(并包含)到项目中
链接:json.rar下载地址
在需要使用Json的文件中添加json.h的头文件即可使用了
使用教程如下:
JsonCpp 是一个C++用来处理JSON 数据的开发包。下面讲一下怎么使用JsonCpp来序列化和反序列化Json对象,以实际代码为例子。

反序列化Json对象

比如一个Json对象的字符串序列如下,其中”array”:[…]表示Json对象中的数组:
{“key1″:”value1″,”array”:[{“key2”:“value2”},{“key2”:“value3”},{“key2”:“value4”}]},那怎么分别取到key1和key2的值呢,代码如下所示:

std::string strValue = “{\”key1\”:\”value1\”,\”array\”:[{\"key2\":\"value2\"},{\"key2\":\"value3\"},{\"key2\":\"value4\"}]}”;

Json::Reader reader;
Json::Value value;

if (reader.parse(strValue, value))
{
std::string out = value["key1"].asString();
std::cout << out << std::endl;
const Json::Value arrayObj = value["array"];
for (int i=0; i<arrayObj.size(); i++)
{
out = arrayObj[i]["key2"].asString();
std::cout << out;
if (i != arrayObj.size() – 1 )
std::cout << std::endl;
}
}

序列化Json对象

先构建一个Json对象,此Json对象中含有数组,然后把Json对象序列化成字符串,代码如下:

Json::Value root;
Json::Value arrayObj;
Json::Value item;
for (int i=0; i<10; i++)
{
item["key"] = i;
arrayObj.append(item);
}

root["key1"] = “value1″;
root["key2"] = “value2″;
root["array"] = arrayObj;
root.toStyledString();
std::string out = root.toStyledString();
std::cout << out << std::endl;

删除Json对象
std::string strContent = “{“key”:“1”,“name”:“test”}”;

Json::Reader reader;

Json::Value value;

if (reader.parse(strContent, value))
{
    Json::Value root=value;

    root.removeMember("key");

    printf("%s \n",root.toStyledString().c_str());

JSON的嵌套
、json简介
1.JSON来历:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
2.JSON作用:JSON对象作为一种通用的中间层,用于跨平台跨语言传输数据
3.JSON语法规范:JSON种有四种基础类型(string,boolean,int,null),有两种复杂类型(array,Object),由于不同平台不同语言的差异性,在各自语言有各自对JSON的理解,Object类型可以理解为对象,也可以认为是哈希表,键值对等。复杂类型之间可以互相嵌套,比如array中含有多个Object,而其中的Object又含有array.
4.Linux下C++中使用JSON:有多种方案,这里使用jsoncpp开源跨平台框架, jsoncpp的安装参考如下链接:linux下正确安装jsoncpp框架,或者自己搜索相关博客安装
5.使用JSONCPP框架: 参考上述链接将其安装后,其动态链接库libjson.so已在系统默认库中(/lib/),相关头文件也在默认系统头文件库中( /usr/include/),此时只需在代码中保护相应头文件,如#include < json/json.h>,在链接时加上-ljson参数链接上libjson.so库即可,例如
g++ -c main.cpp -o main.o #编译
g++ -o main main.o -ljson #链接
./main #运行
二 、直接赋值产生json对象
jsoncpp中使用JSON::Value类型来包含Json对象,如下产生简单的Json对象

#include
#include
#include <json/json.h>

using namespace std;

int main()
{

Json::Value a,b,c,d,e;
a = 12; //int
b = “hello”;//string
c = false; //boolean
d = true; //boolean
//eΪnull
cout << “First” << endl;
cout << a.asInt() << endl;
cout << b.asString() << endl;
cout << c.asString() << endl;
cout << d.asString() << endl;
cout << e.asString() << endl;

//也可以使用复制构造函数来初始化生成JSON对象
a = Json::Value(13);
b = Json::Value("hello world");
c = Json::Value(false);
d = Json::Value(true);
e = Json::Value();
cout << "Second" << endl;
cout << a.asInt() << endl;
cout << b.asString() << endl;
cout << c.asString() << endl;
cout << d.asString() << endl;
cout << e.asString() << endl;
return 0;

}
运行结果如下所示:
在这里插入图片描述
三 、从JSON字符流中读取json对象
使用过JSON都知道,JSON对象传输时的形态为字符流,从JSON字符流中取出JSON对象具有重要应用意义
jsoncpp中使用Json::Reader类型来读取字符流中的数据,如下
#include
#include
#include <json/json.h>

using namespace std;
int main()
{

string message = “{ “data” : { “username” : “test” }, “type” : 6 }”;
Json::Reader reader;
Json::Value value;
//如果message符合Json对象语法,则取出该对象存在value中
if(reader.parse(message.c_str(), value))
{

Json::Value temp = value[“data”]; //取出value对象中的data对象,对象嵌套的一种方式
cout << “username:” << temp[“username”].asString() << endl;
cout << “type:” << value[“type”].asInt() << endl;
cout << “id:” << value[“id”].asString() << endl; //取出null
}
return 0;
}
结果如下所示:
在这里插入图片描述
四 、将json对象转为字符流
将json对象转为字符流才能用于传输交互,代码如下
采用Json::Value对象自带的toStyledString()转变成带有格式的JSON字符流
或者
使用Json::FastWriter类型进行操作,将Json对象写为字符流
#include
#include <json/json.h>
#include
using namespace std;

int main()
{

Json::Value value;
//使用赋值的方式产生JSON对象
value[“name”] = “kangkang”;
Json::Value data;
data[“id”] = “20140801”; //账号
data[“pwd”] = “123456”; //密码
value[“data”] = data; //对象嵌套

//使用toStyledString()函数直接将value对象转为JSON字符流
cout << "toStyledString()" << endl;
cout << value.toStyledString() << endl;

//使用Json::FastWriter类型
Json::FastWriter fw;
cout << "Json::FastWriter()" << endl;
cout << fw.write(value) << endl;
return 0;

}
结果如下
在这里插入图片描述
通常Json::FastWriter产生的格式才是我们传输过程中使用的格式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126378.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 图层合并_cad图层怎么统一到一个图层

    图层合并_cad图层怎么统一到一个图层Arcgis合并线图层和面图层相同类型的图层合并数据管理工具——常规——合并。这个工具只能是线与线、面与面、点与点相同类型的图层合并。输入要合并的图层,设置输出的数据名称就可以了,非常简单。不同类型的图层合并“合并”这个工具只能用于相同类型的图层合并,不同类型的图层合并就要先把图层转为相同的类型。比如一个线图层,一个面图层,可以把线图层直接在转换工具中使用要素转面工具转为面图层,但是这时候我们发现属性表是空的,这样做是不正确的。下边介绍一种方法:线图层和面图层合并为线图层。1、线转栅格转换工

    2022年10月22日
  • 微服务架构技术有哪些_微服务架构组件

    微服务架构技术有哪些_微服务架构组件目录一、微服务架构实现需求二、微服务架构实现技术选型:参考标准的两个维度+微服务实现框架对比(一)技术选型的两个参考标准1.核心组件完备性2.关键要素实现难度(二)微服务实现框架对比SpringBoot/CloudDubbogRPC新锐微服务框架:Istio(ServiceMesh的设计理念)参考书籍、文献和资料:一、微服务架构实现需求技…

    2022年10月21日
  • 华为模拟器eNSP下载与安装教程(面向小白)「建议收藏」

    华为模拟器eNSP下载与安装教程(面向小白)「建议收藏」本人是电脑操作系统是win10企业版,不同操作系统,可能会有所不同。目前许多人对学习华为的网络设备十分感兴趣,但安装华为模拟器eNSP是必不可少的。下载地址:链接:https://pan.baidu.com/s/1XqSfHetChnmiaNtHpjS1oA提取码:4455PS:可能部分电脑在安装之前需要提前关闭防火墙1.打开下载好的安装包选择中文(简体),直接按确定即可2.进入安装向导3.点击“我愿意接受此协议”后,点击下一步4.选择合适的安装路径后,.

    2022年10月14日
  • 数据仓库ods层_设计结果概要

    数据仓库ods层_设计结果概要ODS层辨析ODS全称是OperationalDataStore,即操作数据存储。InmonVSKimballBill.Inmon的定义:ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。常常被作为数据仓库的过渡,也是数据仓库项目的可选项之一。而Kimball的定义:操作型系统的集成,用于当前、历史以及其它细节查询(业务系统的一部分);为决策支持提供当前细节数据(数据仓库的一部分)。ODSVSDBVSED

  • cpu后缀含义「建议收藏」

    cpu后缀含义「建议收藏」一、台式cpu后缀含义1、Intelcpu后缀+X:极致性能处理器,价格不菲,散热惊人,性能至上。后缀+K:不锁倍频处理器,可超频。(游戏用)后缀+F:无内置核心显卡处理器,需要搭配独立显卡。(省钱游戏用)后缀+E:嵌入式工程级处理器。(一般用不到)后缀+S、T:S代表功耗65w,T代表功45w或更低。(一般用不到)2、AMDcpu后缀+K:不锁倍频处理器,可超频。…

  • Hello CTP(一)——期货基础知识

    Hello CTP(一)——期货基础知识一、期货基础1、期货合约期货合约是指由期货交易所统一制定的、规定在将来某一特定的时间和地点交割一定数量和质量商品的标准化合约。期货合约是买方同意在一段指定时间后按特定价格接收某种资产,卖方同意在一段指定时间后按特定价格交付某种资产的协议。双方同意将来交易时使用的价格称为期货价格。双方将来必须进行交易的指定日期称为结算日或交割日。双方同意交换的资产称为标的。期货交易所严格区分平仓和平今,当天建仓只能用平今指令才能平掉。郑商所和大商所不做区分,大商所平今单不收手续费,鼓励作短线。2、开仓平仓

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号