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;