JSON學習筆記

文章目錄

  • 1. JSON是什么
  • 2. JSON的特點與結構
  • 3. JSON的使用
  • 4. JSON文件讀取


1. JSON是什么

JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的數據交換格式,易于人閱讀和編寫,同時也易于機器解析和生成。JSON起源于JavaScript語言,但已成為一種獨立于編程語言的數據格式。它由鍵值對組成,類似于JavaScript中的對象,但更加簡潔和通用化。JSON數據以文本形式存儲,易于解析和生成,因此被廣泛應用于數據交換和存儲。

2. JSON的特點與結構

JSON的特點

  • 文本格式:JSON是一種純文本格式,可以存儲和傳輸數據。
  • 語言無關性:雖然基于JavaScript,但JSON可以被多種編程語言解析。
  • 數據交換:常用于Web應用之間的數據交換。
  • 易于閱讀和編寫:格式簡潔,易于理解和使用。
  • 自我描述:結構清晰,不需要額外的解釋文檔。

JSON的基本結構
JSON數據格式支持以下幾種數據結構:

  • 對象:由花括號{}包圍,包含一系列鍵值對。
  • 數組:由方括號[]包圍,包含一系列值。
  • 字符串:必須用雙引號"包圍。
  • 數字:整數或浮點數。
  • 布爾值:true或false。
  • null:表示空值。

3. JSON的使用

為什么要用json文件應用比較多呢?

我們最常使用的存儲數據的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我們要求比較高,還可以使用數據庫存。

  • 相對于txt,word來說,json格式更加明確,獲取重要信息非常方便。
  • 相對于xml來說,json格式更加簡潔,存儲同樣的文件,花費的內存更小。
  • 相對于Excel來說,json更適合存儲字符類文件。Excel相當于比較簡單的數據庫了。
  • 相對于數據庫來說,json更加方便,數據庫我們還需要做一些設置,安裝一些軟件。json可以直接使用。

在數據傳輸使用時一般創建好JSON數據之后序列化為字符串再傳輸,接收方收到數據后再反序列化為字符串獲取數據
在存儲數據時的使用類似于簡化版的鍵值對
這里展示cpp的使用
演示如下:

// json序列化示例代碼
#include "json.hpp"
using json = nlohmann::json;#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;string func()
{json js;// 直接序列化一個vector容器vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(5);js["list"] = vec;// 直接序列化一個map容器map<int, string> m;m.insert({1, "挺好的?"});m.insert({2, "華山"});m.insert({3, "泰山"});js["path"] = m;string sendBuf = js.dump(); // json數據對象 =》序列化 json字符串//cout<<sendBuf<<endl;return sendBuf;
}int main()
{string recvBuf_1=func();json jsbuf_1=json::parse(recvBuf_1);//反序列化cout<<jsbuf_1["path"]<<endl;map<int,string> mymap=jsbuf_1["path"];for(auto t:mymap){cout<<t.second;}vector my_vector = jsbuf_1["list"];for(auto item:my_vector){cout<<item;}return 0;
}

4. JSON文件讀取

定義的JSON數據結構如下

"Group Name" : "Togehter",
"Number" : 2,
"Students" : {"Lisi" : [165,50],"Zhangsan" : [18070]
}

寫文件如下:

#include <iostream>
#include <fstream>
#include "json.hpp"using namespace std;int main() {//根節點Json::Value root;root["Group Name"] = "Togehter";root["Number"] = 2;//Map形式root["Students"]["Zhangsan"].append(180);root["Students"]["Zhangsan"].append(70);root["Students"]["Lisi"].append(165);root["Students"]["Lisi"].append(50);//父子節點形式Json::Value student;student["Zhangsan"].append(180);student["Zhangsan"].append(70);student["Lisi"].append(165);student["Lisi"].append(50);root["Students"] = student;//格式化輸出到文件  ofstream os;             //實例化輸出類os.open("test.json", std::ios::out); //打開并指定文件以輸出方式打開(往文件里寫)if (!os.is_open())               //檢查文件打開情況cout << "open file failed" << endl;Json::StyledWriter sw;      //定義格式化輸出os << sw.write(root);       //輸出到文件  os.close();                 //關閉文件return 0;
}

針對含有二級對象的內容,可以使用以下兩種方式:

(1)map形式,這種方式較為簡單,但缺點就是只能處理相對比較簡單的二級對象。

在一級對象后直接跟不同的二級對象作為區分,并針對二級對象進行賦值或添加的操作。

root["Students"]["Zhangsan"].append(180);     //添加身高信息
root["Students"]["Zhangsan"].append(70);      //添加體重信息root["Students"]["Lisi"].append(165);         //添加身高信息
root["Students"]["Lisi"].append(50);          //添加體重信息

(2)父子節點的形式,這種方法可以定義更為復雜的形式,缺點就是定義起來較為麻煩。

定義子節點,然后按照與根節點相同的方式對子節點進行處理,最后將其鏈接到根節點即可。

Json::Value student;                //定義子節點
student["Zhangsan"].append(180);
student["Zhangsan"].append(70);student["Lisi"].append(165);
student["Lisi"].append(50);root["Students"] = student;         //將子節點鏈接到根節點上

讀取文件較為簡單,如下:

#include <iostream>
#include <fstream>
#include "json.hpp"using namespace std;int main() {Json::Reader reader;Json::Value root;ifstream is("test.json", ios::binary);  //打開文件,以二進制方式打開文件if (!is.is_open())               //檢查文件打開情況cout << "open file failed" << endl;if (reader.parse(is, root)) {//讀取根節點信息string group_name = root["Group Name"].asString();int number = root["Number"].asInt();cout << "Group Name: " << group_name << endl;cout << "Number: " << number << endl;//讀取子節點信息int body[2];   //身高、體重/********注意遍歷json數組的時候要使用unsigned int的變量********/body[0] = root["Students"]["Zhangsan"][(unsigned int)0].asInt();     body[1] = root["Students"]["Zhangsan"][(unsigned int)1].asInt();cout << "Zhangsan height:" << body[0] << " weight: " << body[1] << endl;body[0] = root["Students"]["Lisi"][(unsigned int)0].asInt();body[1] = root["Students"]["Lisi"][(unsigned int)1].asInt();cout << "Lisi height:" << body[0] << " weight: " << body[1] << endl;}is.close();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79718.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

王牌學院,25西電通信工程學院(考研錄取情況)

1、通信工程學院各個方向 2、通信工程學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、信息與通信工程25年相較于24年上升5分、軍隊指揮學25年相較于24年上升30分 2、新一代電子信息技術&#xff08;專碩&#xff09;25年相較于24年下降25分、通信工程&…

WPF依賴注入IHostApplicationLifetime關閉程序

WPF依賴注入IHostApplicationLifetime關閉程序 使用Application.Current.Shutdown();退出會報異常 應該使用 app.Dispatcher.InvokeShutdown(); Application.Current.Shutdown();app.Dispatcher.InvokeShutdown();static App app new();[STAThread]public static void Main(…

Jenkins 代理自動化-dotnet程序

兩種方式 容器部署 本地部署 容器部署 可自動實現&#xff0c;服務器重啟&#xff0c;容器自動運行 主要將dockerfile 寫好 本地部署 1.服務器重啟自動運行代理 參考下面的鏈接&#xff0c;只是把程序換成 java程序&#xff0c;提前確認好需要的jdk版本 Ubuntu20.04 設置開機…

從Archery到NineData:積加科技驅動數據庫研發效能與數據安全雙升級

積加科技作為國內領先的企業級數字化解決方案服務商&#xff0c;依托自研的 A4X 數字化平臺&#xff08;https://a4x.io/&#xff09;&#xff0c;專注于為全球范圍內的視覺物聯網&#xff08;IoT&#xff09;設備提供 PaaS/SaaS 服務。致力于運用 AI 技術賦能物聯網世界的各類…

SpringBoot整合Logback日志框架深度實踐

一、依賴與默認集成機制 SpringBoot從2.x版本開始默認集成Logback日志框架,無需手動添加額外依賴。當項目引入spring-boot-starter-web時,該組件已包含spring-boot-starter-logging,其底層實現基于Logback+SLF4J組合。這種設計使得開發者只需關注業務日志的輸出規則,無需處…

自由學習記錄(56)

從貼圖空間&#xff08;texture space&#xff09;將值還原到切線空間&#xff08;tangent space&#xff09;向量 tangentNormal.xy (packedNormal.xy * 2 - 1) * _BumpScale; 背后的知識點&#xff1a;法線貼圖中的 RGB 是在 0~1 范圍內編碼的向量 所以貼圖法線是怎么“壓…

【mysql】mysql疑難問題:實際場景解釋什么是排它鎖 當前讀 快照讀

注&#xff1a; 理解本文 前置需要掌握的基礎知識&#xff1a;事務隔離、鎖的概念、并發知識&#xff1b; 事務隔離 尤其是事務延伸問題 是個重難點&#xff0c;絕非八股文那幾句話就能說完的&#xff0c;在實際場景中&#xff0c;分析起來有一定難度 author: csdn博主 孟秋與你…

Python:使用web框架Flask搭建網站

Date: 2025.04.19 20:30:43 author: lijianzhan Flask 是一個輕量級的 Python Web 開發框架&#xff0c;以簡潔靈活著稱&#xff0c;適合快速構建中小型 Web 應用或 API 服務。以下是 Flask 的核心概念、使用方法和實踐指南 Flask 的核心特點&#xff1a; 輕量級 核心代碼僅約…

層次式架構核心:中間層的功能、優勢與技術選型全解析

層次式架構中的中間層是整個架構的核心樞紐&#xff0c;承擔著多種重要職責&#xff0c;在功能實現、優勢體現以及技術選型等方面都有豐富的內容&#xff0c;以下為你詳細介紹&#xff1a; 一、功能 1.業務邏輯處理 復雜規則運算&#xff1a;在許多企業級應用中&#xff0c;…

網絡--應用層自定義協議與序列化

目錄 4-1 應用層 4-2 重新理解 read、write、recv、send 和 tcp 為什么支持全雙工 4-3 開始實現 4-1 應用層 我們程序員寫的一個個解決我們實際問題 , 滿足我們日常需求的網絡程序 , 都是在應用 層 . 再談 " 協議 " 協議是一種 " 約定 ". socke…

fastlio用mid360錄制的bag包離線建圖,提示消息類型錯誤

我用mid360錄制的bag包&#xff0c;激光雷達的數據類型是sensor_msgs::PointCloud2&#xff0c;但是運行fast_lio中的mid360 launch文件&#xff0c;會報錯&#xff08;沒截圖&#xff09;&#xff0c;顯示無法從livox_ros_driver2::CustomMsg轉換到sensor_msgs::PointCloud2。…

C# WinForm窗口TextBox控件只能輸入數字(包括小數)并且恢復Ctrl+C復制和Ctrl+V粘貼功能

1. 前言 最近在寫定GPS定位時&#xff0c;經緯度是用的double類型&#xff0c;并且經緯度的要求是小數點后最少6位&#xff0c;多了能達到17位&#xff0c;又遇到了常用的TextBox控件只能輸入數字、小數的功能&#xff0c;因為有一年多沒有寫程序&#xff0c;現在再來寫這些感…

【MySQL數據庫】數據類型

目錄 1&#xff0c;數據類型分類 2&#xff0c;bit類型 3&#xff0c;小數類型 3-1&#xff0c;float/double類型 3-2&#xff0c;decimal類型 4&#xff0c;字符串類型 4-1&#xff0c;char 4-2&#xff0c;varchar 5&#xff0c;日期和時間類型 6&#xff0c;enum和…

Spark-SQL核心編程2

路徑問題 相對路徑與絕對路徑&#xff1a;建議使用絕對路徑&#xff0c;避免復制粘貼導致的錯誤&#xff0c;必要時將斜杠改為雙反斜杠。 數據處理與展示 SQL 風格語法&#xff1a;創建臨時視圖并使用 SQL 風格語法查詢數據。 DSL 風格語法&#xff1a;使用 DSL 風格語法查詢…

pandas庫詳解

CONTENT 基本數據結構SeriesDataFrame 數據讀取與寫入讀取 CSV 文件寫入 CSV 文件 數據清洗處理缺失值數據類型轉換 數據操作索引與切片數據合并數據分組與聚合 數據可視化 基本數據結構 Series Series 屬于一維標記數組&#xff0c;由一組數據和對應的索引構成。 import pa…

黑馬商城(五)微服務保護和分布式事務

一、雪崩問題 二、雪崩-解決方案&#xff08;服務保護方案&#xff09; 請求限流&#xff1a; 線程隔離&#xff1a; 服務熔斷&#xff1a; 服務保護組件&#xff1a; 三、Sentinel 引入依賴&#xff1a; <!--sentinel--> <dependency><groupId>com.aliba…

洛谷P1312 [NOIP 2011 提高組] Mayan 游戲

題目 #算法/進階搜索 思路: 根據題意,我們可以知道,這題只能枚舉,剪枝,因此,我們考慮如何枚舉,剪枝. 首先,我們要定義下降函數down(),使得小木塊右移時,能夠下降到最低處,其次,我們還需要寫出判斷函數,判斷矩陣內是否有小木塊沒被消除.另外,我們還需要消除函數,將矩陣內三個相連…

基于Redis的3種分布式ID生成策略

在分布式系統設計中&#xff0c;全局唯一ID是一個基礎而關鍵的組件。隨著業務規模擴大和系統架構向微服務演進&#xff0c;傳統的單機自增ID已無法滿足需求。高并發、高可用的分布式ID生成方案成為構建可靠分布式系統的必要條件。 Redis具備高性能、原子操作及簡單易用的特性&…

Spotlight on Mysql詳細介紹

1. 版本............................................................................................................................................1 2. 使用介紹...............................................................................................…

背包 DP 詳解

文章目錄 背包DP01 背包完全背包多重背包二進制優化單調隊列優化 小結 背包DP 背包 DP&#xff0c;說白了就是往一個背包里扔東西&#xff0c;求最后的最大價值是多少&#xff0c;一般分為了三種&#xff1a;01 背包、完全背包和多重背包。而 01 背包則是一切的基礎。 01 背包…