JSON パースャーの実装と自訂フォーマットのサポート

JSONArray と JSON オブジェクトの解析を実装します。具体的には以下を実現します:

  • JSONArray から配列を生成
  • JSON オブジェクトから Dictionary を生成
  • 文字列、数値、真偽値、null 値を解析
  • コメントのスキップ
  • 特殊文字のエスケープ処理

解析器の主なクラス構成は以下のとおりです:


public static class JsonParser
{
    private ref struct JsonDataParser
    {
        private readonly ReadOnlySpan<char> _span;
        private int _position;

        public object? ParseValue()
        {
            SkipWhitespaceAndComments();
            char current = _span[_position];
            return current switch
            {
                '{' => ParseObject(),
                '[' => ParseArray(),
                '"' => ParseString(),
                't' or 'f' => ParseBoolean(),
                'n' => ParseNull(),
                _ when IsDigit(current) || current == '-' => ParseNumber(),
                '/' => ThrowUnexpectedComment(),
                _ => ThrowUnexpectedCharacter(current)
            };
        }

        // その他の解析メソッド
        private Dictionary ParseObject();
        private List<object> ParseArray();
        private void SkipWhitespaceAndComments();
        // ...
    }

    public static object? Parse(string json)
    {
        var parser = new JsonDataParser(json);
        return parser.ParseValue();
    }
}

文字列の解析例:


{
  "name": "小明",
  "age": 20,
  "isStudent": true,
  "hobbies": ["篮球", "音乐", "编程"]
}

数値の解析例:


{
  "number": 123,
  "decimal": 123.45,
  "scientific": 1e5,
  "negative": -678
}

配列の解析例:


[
  "apple",
  "banana",
  "orange"
]

オブジェクトの解析例:


{
  "person": {
    "name": "John",
    "age": 30,
    "isStudent": false
  }
}

特殊文字とエスケープ処理例:


{
  "escapedString": " \" \\ / \b \f \n \r \t \u8424\u706b\u521d\u8292 "
}

数値の特殊フォーマット例:


{
  "value": .9527
}

使用例:


// 配列の生成
var jsonArray = new List<object> { "a", "b", "c" };

// オブジェクトの生成
var jsonObject = new Dictionary
{
    { "name", "小明" },
    { "age", 20 },
    { "isStudent", true },
    { "hobbies", new List<object> { "篮球", "音乐", "编程" } }
};

// JSON 文字列への変換
string json = JsonSerializer.Serialize(jsonObject);
Console.WriteLine(json); // {"name":"小明","age":20,"isStudent":true,"hobbies":["篮球","音乐","编程"]}

自訂フォーマット例:


// 自訂の数値フォーマットを使用
var customConfig = new Dictionary
{
    { "name", "小明" },
    { "value", .9527 }
};

// JSON 文字列への変換
string customJson = JsonSerializer.Serialize(customConfig);
Console.WriteLine(customJson); // {"name":"小明","value":.9527}

タグ: JSON解析器 C# 自訂注釋 特殊文字處理 数値解析

7月5日 19:49 投稿