C#中實現JSON解析器

JSON(JavaScript Object Notation)即 JavaScript 對象表示法,是一種輕量級的數據交換格式。

起源與發展

JSON 源于 JavaScript 編程語言,是 JavaScript 對象字面量語法的一個子集。但如今它已經獨立于 JavaScript,成為一種通用的數據格式,廣泛應用于各種編程語言和系統之間的數據交換。由于其簡潔性和通用性,在 Web 開發、移動應用開發、云計算等領域得到了極為廣泛的應用。

特點

輕量級:相較于 XML 等其他數據交換格式,JSON 的數據結構更加簡潔,文件體積更小,這使得在網絡傳輸過程中能夠減少帶寬占用,提高傳輸效率。
易讀性:JSON 的文本格式清晰、簡潔,符合人類的閱讀習慣,開發人員可以很容易地理解和解析其中的數據內容。
跨語言兼容性:幾乎所有的現代編程語言都提供了對 JSON 的支持,能夠方便地將 JSON 數據解析為本地數據結構,或者將本地數據結構轉換為 JSON 格式,這使得不同編程語言開發的系統之間能夠輕松進行數據交換。

實現思路:

詞法分析

詞法分析的目的是將輸入的 JSON 字符串分解為一個個的詞法單元,例如花括號、方括號、逗號、冒號、字符串、數字、布爾值和空值等。我們可以定義一個 Token 類來表示詞法單元,以及一個 Scanner 類來進行詞法分析。

語法分析

語法分析的目的是根據詞法單元構建 JSON 對象或數組。我們可以定義一個 Parser 類來進行語法分析,它將接收一個 Token 列表作為輸入,并返回解析后的 JSON 對象或數組。

流程圖:

代碼實現:

1.定義Token類:

public enum TokenType
{STRING,NUMBER,BOOLEAN,NULL,LEFT_BRACE,RIGHT_BRACE,LEFT_BRACKET,RIGHT_BRACKET,COMMA,COLON,EOF
}public class Token
{public TokenType Type { get; }public object Value { get; }public Token(TokenType type, object value){Type = type;Value = value;}
}

 2.實現掃描類:

public class Scanner
{private readonly string source;private int start;private int current;private int line = 1;private readonly List<Token> tokens = new List<Token>();public Scanner(string source){this.source = source;}public List<Token> Scan(){while (!IsAtEnd()){start = current;ScanToken();}tokens.Add(new Token(TokenType.EOF, null));return tokens;}private bool IsAtEnd() => current >= source.Length;private void ScanToken(){char c = Advance();switch (c){case '{':AddToken(TokenType.LEFT_BRACE, c);break;case '}':AddToken(TokenType.RIGHT_BRACE, c);break;case '[':AddToken(TokenType.LEFT_BRACKET, c);break;

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

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

相關文章

【Maven】子POM與父POM

文章目錄 子POM與父POM一、繼承的內容1.子 POM 可以繼承父 POM 的內容2.子 POM 中聲明相同配置覆蓋規則示例 子POM與父POM 一、繼承的內容 在 Maven 項目結構中&#xff0c;子 POM&#xff08;子模塊&#xff09;可以繼承父 POM 的很多配置。合理使用繼承機制可以大大減少重復…

12前端項目----添加購物車1.0

商品添加購物車 商品數量添加購物車瀏覽器本地存儲localStoragesessionStorage添加成功頁面 商品數量 輸入為數字&#xff0c;最少為1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…

EasyRTC嵌入式音視頻通信SDK助力視頻客服,開啟智能服務新時代

一、背景 在數字化服務浪潮下&#xff0c;客戶對服務體驗的要求日益提升&#xff0c;傳統語音及文字客服在復雜業務溝通、可視化指導等場景下漸顯不足。視頻客服雖成為企業服務升級的關鍵方向&#xff0c;但普遍面臨音視頻延遲高、畫質模糊、多端適配難、功能擴展性差等問題&a…

干貨分享|MaxKB智能問數方案及步驟詳解

DeepSeek-R1的發布掀起了AI智能變革的浪潮。在過去幾個月里&#xff0c;MaxKB開源企業級AI助手已經幫助大量企業和組織快速落地了DeepSeek&#xff0c;讓AI在不同的行業土壤中產生持續、可度量的業務價值。 MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09; 可以為本…

【python】數據類型小結

1.數據類型 int、float、str、bool、元組tuple、列表list、字典dict、集合set 分為兩類&#xff1a;可變和不可變數據類型 2.可變數據類型和不可變數據類型 當變量的值變化&#xff0c;內存地址不變則為可變數據類型&#xff0c; eg&#xff1a;int、float、bool、字符串st…

泰山派常用命令

0.連接adb 設備列表&#xff1a;adb devices 進入命令&#xff1a;adb shell 1.連接WiFi 查看當前網絡&#xff1a;nmcli con show 我的WiFi名稱&#xff1a;6 我的WiFi密碼&#xff1a;12345789 連接當前網絡&#xff1a;nmcli device wifi connect 6 password 1234578…

whois為什么有時會返回兩個不同的域名狀態

前陣子發現一直想注冊但被別人注冊了的一個域名快要過期了&#xff0c;就想著寫個腳本跑在電腦上&#xff0c;每分鐘檢查一次域名狀態&#xff0c;一旦域名被正式刪除&#xff0c;就發封郵件通知我&#xff0c;這樣就不用頻繁手動檢查域名狀態了。 寫腳本時發現一個有趣的現象…

NGINX ngx_http_addition_module 模塊響應體前后注入內容

一、模塊概述 模塊名稱&#xff1a;ngx_http_addition_module引入版本&#xff1a;自 0.7.9 起支持 addition_types&#xff0c;0.8.29 起支持“*”通配&#xff1b;功能&#xff1a;對符合 MIME 類型的響應&#xff0c;在響應體前后分別插入指定子請求 URI 返回的內容&#x…

半監督學習與強化學習的結合:新興的智能訓練模式

&#x1f4cc; 友情提示&#xff1a; 本文內容由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;創作平臺的gpt-4o-mini模型生成&#xff0c;旨在提供技術參考與靈感啟發。文中觀點或代碼示例需結合實際情況驗證&#xff0c;建議讀者通過官方文檔或實踐進一步確認其準…

復習Vue136~180

1.使用create-vue創建項目 npm init vuelatest 項目目錄和關鍵文件&#xff1a; new Vue() 創建一個應用實例 > createApp()、createRouter() createStore() 、將創建實例進行了封裝&#xff0c;保證每個實例的獨立封閉性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…

QT采用mqtt進行通信(17.1)

文章目錄 1.試錯歷程2. qt5.8安裝3. 開始搞了4. 測試連接mqtt broker1.試錯歷程 嘗試過網上說的各種版本,官方庫和第三方庫,試過qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各個版本,都能編譯通過,調用mqtt庫,但是都不能連接成功,真的是試吐了,不知道他們的為什么都能成功,…

西門子PLC結構化編程_水處理系統水泵多備多投

文章目錄 前言一、功能概述二、程序編寫1. 需求分析2. 編寫運行時間累計功能塊3. 創建自定義數據類型1. 時間排序數據類型2. 多備多投數據類型3. 多備多投切換數據類型 4. 編程1. 創建DB數據塊1. 多備多投數據塊2. 多備多投切換數據塊 2. 創建FB功能塊 三、程序調用總結 前言 …

QT:自定義ComboBox

實現效果: 實現combobox的下拉框區域與item區域分開做UI交互顯示。 支持4種實現效果,如下 效果一: 效果二: 效果三: 效果四: 實現邏輯: ui由一個toolbutton和combobox上下組合成,重點在于combobox。 我設置了4種枚舉,ButtonWithComboBox對應效果一;OnlyButt…

VS2022+OpenCasCade配置編譯

一、Open CASCADE Technology介紹及安裝&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;簡稱OCCT&#xff09;是一款開源的 3D CAD/CAM/CAE 軟件開發平臺&#xff0c;廣泛應用于工業設計、工程仿真、制造等領域。開源OCC對象庫是一個面向對象C類庫&…

【OSG學習筆記】Day 12: 回調機制——動態更新場景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用來動態更新場景的關鍵機制。 借助UpdateCallback&#xff0c;你能夠實現節點的動畫效果&#xff0c;像旋轉、位移等。 NodeCallback osg::NodeCallback 是一個更通用的回調類&…

全新升級:BRAV-7601-T003高性能無風扇AI邊緣計算系統,助力智能未來!

在數字化與智能化飛速發展的今天&#xff0c;AI邊緣計算正成為各行各業的核心驅動力。BRAV-7601作為一款高性能無風扇AI邊緣計算系統&#xff0c;憑借其強大的硬件配置與豐富的擴展能力&#xff0c;為車路協同、特種車輛車載、機器視覺、醫療影像等領域提供了卓越的解決方案。最…

刪除 Git 遠程記錄并重新設置

刪除 Git 遠程記錄并重新設置 以下是在 Windows 平臺上刪除當前項目的 Git 遠程記錄并重新設置遠程存儲庫的步驟&#xff1a; 步驟一&#xff1a;查看當前遠程倉庫 首先&#xff0c;檢查當前設置的遠程倉庫&#xff1a; git remote -v這會顯示所有已配置的遠程倉庫及其 URL…

有哪些和PPT自動生成有關的MCP項目?

隨著AI技術的快速發展, Model Context Protocol(MCP) 作為一種連接大型語言模型(LLMs)與外部工具的開放協議,正在重塑自動化辦公領域。在PPT自動生成場景中,MCP通過標準化接口實現了AI模型與設計工具、數據源的無縫整合。以下從技術框架、項目案例、應用場景三個維度展開…

PostgreSQL psql 命令和常用的 SQL 語句整理

PostgreSQL psql 命令和常用的 SQL 語句整理 1、登錄PostgreSQL數據庫2、psql 命令3、數據庫操作4、模式操作5、表操作6、數據操作7、索引操作8、視圖操作9、權限操作 1、登錄PostgreSQL數據庫 在系統的命令行界面&#xff08;如 Windows 的 cmd 或者 PowerShell、Linux 的終端…

【unity游戲開發入門到精通——UGUI】文本輸入控件 —— InputField舊控件

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、文本輸入控件2、InputField舊文本輸入控件組成 一、InputField文本輸入…