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}