📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「C Sharpの基礎 - JSONファイル」を「C Sharpの基礎 - JSON」に、リダイレクトを残さずに移動しました |
|||
| 28行目: | 28行目: | ||
また、セキュリティの観点から、信頼できないソースからのJSONデータを扱う場合は、適切なバリデーションを行うことが重要である。<br> | また、セキュリティの観点から、信頼できないソースからのJSONデータを扱う場合は、適切なバリデーションを行うことが重要である。<br> | ||
不正なデータによる脆弱性を防ぐため、デシリアライズ時には型チェックや範囲チェックを実施することを推奨する。<br> | 不正なデータによる脆弱性を防ぐため、デシリアライズ時には型チェックや範囲チェックを実施することを推奨する。<br> | ||
<br><br> | |||
== 動的な方法 == | |||
==== JSONファイルの読み込み ==== | |||
以下の例では、非同期処理およびストリーミング処理を使用して、JSONファイルの読み込んでいる。<br> | |||
<br> | |||
具体的には、JsonDocument.ParseAsyncメソッドを使用してJSONデータを非同期で解析して、JsonElementクラスを通じてデータにアクセスしている。<br> | |||
また、FileStreamクラスを使用してストリーミング処理することにより、大きなJSONファイルを扱う場合にもメモリ効率が向上している。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Text.Json; | |||
using System.Threading.Tasks; | |||
class JsonFileReader | |||
{ | |||
public static async Task ReadJsonFileAsync(string filePath) | |||
{ | |||
try | |||
{ | |||
using FileStream fileStream = File.OpenRead(filePath); | |||
using JsonDocument document = await JsonDocument.ParseAsync(fileStream); | |||
JsonElement root = document.RootElement; | |||
// JSONの構造に応じて、適切にデータにアクセス | |||
if (root.TryGetProperty("name", out JsonElement nameElement)) | |||
{ | |||
Console.WriteLine($"名前: {nameElement.GetString()}"); | |||
} | |||
if (root.TryGetProperty("age", out JsonElement ageElement)) | |||
{ | |||
Console.WriteLine($"年齢: {ageElement.GetInt32()}"); | |||
} | |||
if (root.TryGetProperty("hobbies", out JsonElement hobbiesElement) && hobbiesElement.ValueKind == JsonValueKind.Array) | |||
{ | |||
Console.WriteLine("趣味:"); | |||
foreach (JsonElement hobby in hobbiesElement.EnumerateArray()) | |||
{ | |||
Console.WriteLine($"- {hobby.GetString()}"); | |||
} | |||
} | |||
} | |||
catch (FileNotFoundException) | |||
{ | |||
Console.WriteLine("エラー: 指定されたファイルが存在しない"); | |||
} | |||
catch (JsonException ex) | |||
{ | |||
Console.WriteLine($"JSONパースエラー: {ex.Message}"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"予期せぬエラーが発生: {ex.Message}"); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、上記のクラスを使用してJSONファイルを読み込んでいる。<br> | |||
<syntaxhighlight lang="c#"> | |||
class Program | |||
{ | |||
static async Task Main(string[] args) | |||
{ | |||
string readFilePath = "sample.json"; | |||
// JSONファイルの読み込み | |||
await JsonFileReader.ReadJsonFileAsync(readFilePath); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== JSONファイルの書き込み ==== | |||
以下の例では、非同期処理およびストリーミング処理を使用して、JSONファイルの書き込んでいる。<br> | |||
<br> | |||
具体的には、JsonSerializer.SerializeAsyncメソッドを使用してオブジェクトをJSONに非同期でシリアライズして、ファイルに書き込んでいる。<br> | |||
また、FileStreamクラスを使用してストリーミング処理することにより、大きなJSONファイルを扱う場合にもメモリ効率が向上している。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Text.Json; | |||
using System.Threading.Tasks; | |||
class JsonFileWriter | |||
{ | |||
public static async Task WriteJsonFileAsync(string filePath, object data) | |||
{ | |||
try | |||
{ | |||
using FileStream createStream = File.Create(filePath); | |||
await JsonSerializer.SerializeAsync(createStream, data, new JsonSerializerOptions | |||
{ | |||
WriteIndented = true // 整形されたJSONを出力 | |||
}); | |||
Console.WriteLine("JSONファイルの書き込みが完了"); | |||
} | |||
catch (UnauthorizedAccessException) | |||
{ | |||
Console.WriteLine("エラー: ファイルへの書き込み権限がない"); | |||
} | |||
catch (JsonException ex) | |||
{ | |||
Console.WriteLine($"JSONシリアライズエラー: {ex.Message}"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"予期せぬエラーが発生: {ex.Message}"); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、上記のクラスを使用してJSONファイルを書き込んでいる。<br> | |||
<syntaxhighlight lang="c#"> | |||
class Program | |||
{ | |||
static async Task Main(string[] args) | |||
{ | |||
string writeFilePath = "sample.json"; | |||
// JSONファイルの書き込み | |||
var data = new | |||
{ | |||
name = "山田太郎", | |||
age = 30, | |||
hobbies = new[] { "読書", "旅行", "料理" } | |||
}; | |||
await JsonFileWriter.WriteJsonFileAsync(writeFilePath, data); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||