日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

json11库的使用

發(fā)布時(shí)間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 json11库的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JSON(JavaScript Object Notation)是一種輕量級(jí)的文本數(shù)據(jù)交換格式,易于讓人閱讀。同時(shí)也易于機(jī)器解析和生成。盡管JSON是Javascript的一個(gè)子集,但JSON是獨(dú)立于語(yǔ)言的文本格式,并且采用了類似于C語(yǔ)言家族的一些習(xí)慣。JSON解析器和JSON庫(kù)支持許多不同的編程語(yǔ)言。

幾乎所有與網(wǎng)頁(yè)開發(fā)相關(guān)的語(yǔ)言都有JSON庫(kù)。JSON比XML更小、更快。

JSON用于描述數(shù)據(jù)結(jié)構(gòu),有以下形式存在:

(1)、對(duì)象(object):一個(gè)對(duì)象以”{“開始,并以”}”結(jié)束。一個(gè)對(duì)象包含一系列非排序的名稱/值對(duì),每個(gè)名稱/值對(duì)之間使用”,”分隔。

(2)、名稱/值(collection):名稱和值之間使用”:”隔開。一個(gè)名稱是一個(gè)字符串;一個(gè)值 (value)可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)、true、false、null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套

JSON語(yǔ)法規(guī)則:(1)、數(shù)據(jù)在鍵值對(duì)中;(2)、數(shù)據(jù)由逗號(hào)分隔;(3)、花括號(hào)保存對(duì)象;(4)、方括號(hào)保存數(shù)組。

JSON的值可以是:

(1)、數(shù)值:一系列0-9的數(shù)字組合,可以為負(fù)數(shù)或者小數(shù)。還可以用”e”或者”E”表示為指數(shù)形式。數(shù)值(number)也與C或者Java的數(shù)值非常相似。除去未曾使用的八進(jìn)制與十六進(jìn)制格式。除去一些編碼細(xì)節(jié)。

(2)、字符串:以""括起來(lái)的一串字符。字符串(string)是由雙引號(hào)包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(character string)。字符串(string)與C或者Java的字符串非常相似。

(3)、布爾值:表示為true或者false。

(4)、數(shù)組(Array):數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以”[“(左中括號(hào))開始,”]”(右中括號(hào))結(jié)束。值之間使用”,”(逗號(hào))分隔。數(shù)組索引從0開始。

(5)、對(duì)象(object):對(duì)象是一個(gè)無(wú)序的”名稱/值”對(duì)集合。一個(gè)對(duì)象以”{“開始,并以”}”結(jié)束。每個(gè)”名稱”后跟一個(gè)”:”(冒號(hào))。”名稱/值”對(duì)之間使用”,”(逗號(hào))分隔。

(6)、null

空白可以加入到任何符號(hào)之間。

各式各樣開源的JSON庫(kù)非常多,這里介紹下GitHub上dropbox的json11庫(kù)的使用,地址:https://github.com/dropbox/json11,它用起來(lái)非常方便,只有兩個(gè)文件,一個(gè)json11.hpp,一個(gè)json11.cpp。

新建一個(gè)Json11_Test控制臺(tái)工程,將json11的兩個(gè)文件加入到此工程中,測(cè)試代碼Json11_Test.cpp如下:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "json11.hpp"#ifdef _MSC_VER
#include <Windows.h>
static std::string utf8_to_gbk(const char* utf8) {char gbk[256];const int maxlen = 256;wchar_t unicode_str[maxlen];int outlen = MultiByteToWideChar(CP_UTF8, 0, utf8, strlen(utf8), unicode_str, maxlen);outlen = WideCharToMultiByte(CP_ACP, 0, unicode_str, outlen, gbk, 256, NULL, NULL);gbk[outlen] = '\0';std::string str;str.assign(gbk);return str;
}
#endifint test1();
int test2();
int test3();
int test4();int main()
{test4();std::cout << "ok" << std::endl;return 0;
}int test4()
{//std::istringstream  std::filebuf in;if (!in.open("E:/GitCode/Messy_Test/testdata/json.data", std::ios::in)) {std::cout << "fail to open file" << std::endl;return -1;}std::istream iss(&in);std::istreambuf_iterator<char> eos;std::string s(std::istreambuf_iterator<char>(iss), eos);std::string err;auto json = json11::Json::parse(s, err);if (!err.empty()) {in.close();return -1;}std::cout << "************** show file info *****************" << std::endl;std::string json_str = json.dump();std::cout << json_str << std::endl;std::cout << "*************** start parse ****************" << std::endl;std::string name = json["name"].string_value();std::string addr = json["address"].string_value();int age = json["age"].int_value();json11::Json::array array_ = json["value1"].array_items();std::vector<std::vector<float>> value1;value1.resize(array_.size());for (int i = 0; i < array_.size(); i++) {json11::Json::array tmp = array_[i].array_items();value1[i].resize(tmp.size());for (int j = 0; j < tmp.size(); j++) {value1[i][j] = tmp[j].number_value();}}std::vector<float> value2;array_ = json["value2"].array_items();value2.resize(array_.size());for (int i = 0; i < array_.size(); i++) {value2[i] = array_[i].number_value();}std::string beijing_addr;bool beijing_car, beijing_cat;if (json["bei_jing"].is_null()) {std::cout << "failed to get bei_jing info" << std::endl;} else {json11::Json::object object_ = json["bei_jing"].object_items();beijing_addr = object_["address"].string_value();beijing_car = object_["car"].bool_value();beijing_cat = object_["cat"].bool_value();}std::string shandong_addr, tmp_addr;std::vector<std::string> shandong_value1;if (json["shan_dong"].is_null()) {std::cout << "failed to get shan_dong info" << std::endl;} else {json11::Json::object object_ = json["shan_dong"].object_items();tmp_addr = object_["tmp"].string_value();if (tmp_addr == "") {std::cout << "tmp is null" << std::endl;}shandong_addr = object_["address"].string_value();json11::Json::array tmp = object_["value1"].array_items();shandong_value1.resize(array_.size());json11::Json json_ = tmp[0];shandong_value1[0] = json_["ji_nan"].string_value();json_ = tmp[1];shandong_value1[1] = json_["tai_an"].string_value();}std::cout << "************** parse result ***************" << std::endl;std::cout << "name: " << utf8_to_gbk(name.c_str()) << std::endl;std::cout << "address: " << utf8_to_gbk(addr.c_str()) << std::endl;std::cout << "age: " << age << std::endl;std::cout << "value1: " << std::endl;for (int i = 0; i < value1.size(); i++) {for (int j = 0; j < value1[i].size(); j++) {std::cout << "  " << value1[i][j];}std::cout << std::endl;}std::cout << "value2: " << std::endl;for (int i = 0; i < value2.size(); i++) {std::cout << "  " << value2[i];}std::cout << std::endl;std::cout << "bei_jing info: " << std::endl;std::cout << "  address: " << utf8_to_gbk(beijing_addr.c_str()) << std::endl;std::cout << "  car: " << beijing_car << std::endl;std::cout << "  cat: " << beijing_cat << std::endl;std::cout << "shan_dong info: " << std::endl;std::cout << "  address: " << utf8_to_gbk(shandong_addr.c_str()) << std::endl;std::cout << "  value1: " << std::endl;std::cout << "    ji_nan: " << utf8_to_gbk(shandong_value1[0].c_str()) << std::endl;std::cout << "    tai_an: " << utf8_to_gbk(shandong_value1[1].c_str()) << std::endl;in.close();return 0;
}int test1()
{json11::Json my_json = json11::Json::object{{ "中國(guó)", "北京" },{ "key2", false },{ "key3", json11::Json::array { 1, 2, 3 } },};std::string json_str = my_json.dump();std::string key_1 = my_json["中國(guó)"].string_value();std::cout << json_str << std::endl;std::cout << key_1 << std::endl;return 0;
}int test2()
{class Point {public:int x;int y;Point(int x, int y) : x(x), y(y) {}json11::Json to_json() const { return json11::Json::array { x, y }; }};std::vector<Point> points = { { 1, 2 }, { 10, 20 }, { 100, 200 } };std::string points_json = json11::Json(points).dump();std::cout << points_json << std::endl;return 0;
}int test3()
{json11::Json json = json11::Json::array { json11::Json::object{ { "k", "v" } } };std::string str = json[0]["k"].string_value();std::cout << str << std::endl;return 0;
}

自己寫了個(gè)Json格式的文本文件json.data,內(nèi)容如下:

{"name": "spring","address": "北京","age": 30,"value1": [[23, 43, -2.3, 6.7, 90],[-9, -19, 10, 2],[-5, -55]],"value2": [13.3, 1.9, 2.10],"bei_jing": {"address": "海淀","car": false,"cat": true},"shan_dong": {"address": "濟(jì)南","value1": [{"ji_nan": "趵突泉"}, {"tai_an": "泰山"}]}
}

測(cè)試代碼中的test4()會(huì)調(diào)用json.data文件,執(zhí)行結(jié)果如下圖所示:

主要參考文獻(xiàn):

1.?https://zh.wikipedia.org/wiki/JSON

2.?http://www.json.org/json-zh.html

GitHub:https://github.com/fengbingchun/Messy_Test

總結(jié)

以上是生活随笔為你收集整理的json11库的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請(qǐng)說(shuō)明來(lái)源于"生活随笔",并保留原作者的名字。

本文地址:json11库的使用