📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の7版が非表示)
4行目: 4行目:
C#では、JSONデータの操作が便利に行えるようになっている。<br>
C#では、JSONデータの操作が便利に行えるようになっている。<br>
<br>
<br>
主に、<code>System.Text.Json</code>名前空間を使用してJSONの処理を行う。<br>
C#の標準ライブラリでJSONを扱う場合は、<code>System.Text.Json</code>名前空間を使用してJSONの処理を行う。<br>
この名前空間には、JSONのシリアライズ (オブジェクトをJSON文字列に変換) とデシリアライズ (JSON文字列をオブジェクトに変換) を行うためのクラスやメソッドが含まれている。<br>
この名前空間には、JSONのシリアライズ (オブジェクトをJSON文字列に変換) とデシリアライズ (JSON文字列をオブジェクトに変換) を行うためのクラスやメソッドが含まれている。<br>
<br>
<u><code>System.Text.Json</code>名前空間は、.NET Core 3.0以降で導入されている。</u><br>
<br>
<br>
JSONファイルの読み込みは、通常のテキストファイルと同様に<code>File.ReadAllText</code>メソッドを使用して行う。<br>
JSONファイルの読み込みは、通常のテキストファイルと同様に<code>File.ReadAllText</code>メソッドを使用して行う。<br>
387行目: 389行目:
<u>Json.NETのライセンスは、MITライセンスに準拠している。</u><br>
<u>Json.NETのライセンスは、MITライセンスに準拠している。</u><br>
<br>
<br>
* Newtonsoft.Json (Json.NET) ライブラリの公式Webサイト
*: https://www.newtonsoft.com/json
<br>
==== Newtonsoft.Json (Json.NET) ライブラリのインストール ====
RiderまたはVisual StudioからNuGetを使用して、Json.NETライブラリをインストールする。<br>
* Riderの場合
*# プロジェクトを開く。
*# [ツール]メインメニュー - [Nuget] - [ソリューション の Nuget パッケージを管理] (または、[<プロジェクト名> の Nuget パッケージを管理])を選択する。
*# メイン画面下部にある[パッケージ]タブから <u>Json.NET</u> と入力して検索する。
*# メイン画面下部の右にある[+]ボタンを押下して、Json.NETライブラリをインストールする。
*: <br>
* Visual Studioの場合
*# プロジェクトを開く。
*# NuGetパッケージマネージャーを開く。
*#* [ツール]メインメニュー - [NuGetパッケージマネージャー]を選択して、[ソリューションのNuGetパッケージの管理]を選択する。
*#* または、ソリューションエクスプローラーでプロジェクトを右クリックして、コンテキストメニューから[NuGetパッケージの管理]を選択する。
*# Json.NETライブラリを検索する。
*#: NuGetパッケージマネージャーの検索ボックスに <u>Json.NET</u> と入力して検索する。
*# Json.NETライブラリのインストール
*#: 検索結果からJson.NETライブラリを選択して、[インストール]ボタンを押下する。
*# インストールの確認ダイアログが表示されるので、[OK]ボタンを押下してインストールを完了する。
*# 参照の確認
*#: インストールが完了した後、プロジェクトの参照にJson.NETライブラリが追加されていることを確認する。
*: <br>
* パッケージマネージャーコンソールからインストールする場合
*# プロジェクトを開く。
*# [表示]メインメニュー - [その他のウィンドウ] - [パッケージマネージャーコンソール]を選択して、パッケージマネージャーコンソールを開く。
*# パッケージマネージャーコンソールから、Json.NETライブラリをダウンロードしてインストールする。
*#: <code>Install-Package Newtonsoft.Json</code>
*# ソリューションエクスプローラーのプロジェクトの参照において、Json.NETライブラリが追加されていることを確認する。
*: <br>
* <code>dotnet</code>コマンドを使用する場合
*# ターミナルを開く。
*# プロジェクトのルートディレクトリに移動する。
*# Json.NETライブラリをインストールする。
*#: 最新の安定版をインストールする場合
*#: <code>dotnet add package Newtonsoft.Json</code>
*#: <br>
*#: バージョンを指定してインストールする場合
*#: <code>dotnet add package Newtonsoft.Json --version <バージョン></code>
*#: <br>
*: <u>※注意</u>
*: <u>プロジェクトがGit等のバージョン管理システムを使用している場合、これらの変更がトラッキングされることを確認すること。</u>
*: <u>プロジェクトを再ビルドして、新しく追加されたパッケージが正しく統合されていることを確認することを推奨する。</u>
<br>
プロジェクトにおいて、Json.NETライブラリを使用する場合は、ソースコードファイルの先頭にusingステートメントを追加する。<br>
<syntaxhighlight lang="c#">
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;  // LINQ to JSONを使用する場合
</syntaxhighlight>
<br>
また、大きなサイズなJSONファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
<br>
==== LINQ to JSON ====
LINQ to JSONは、<code>Newtonsoft.Json.Linq</code>名前空間に含まれるクラスとメソッドを使用してJSONデータを操作するための機能である。<br>
<br>
LINQ to JSONを使用することにより、JSONデータの読み込み、操作、書き込みを簡単に行うことができる。<br>
このアプローチは、動的なJSONデータの処理やJSONの構造が事前に完全には分からない場合に有効である。<br>
<br>
また、LINQ to JSONは、C#標準LINQクエリ構文と組み合わせて使用することもできるため、より複雑なJSONデータの操作や検索を行うことができる。<br>
<br>
また、C#標準のLINQクエリ構文を組み合わせて使用する場合、JSONの構造が複雑であっても、特定の条件に合う要素を柔軟に見つけることができる。<br>
例えば、オブジェクトが複数存在する場合やネストされた構造の中に存在する場合でも、全ての該当箇所を編集することができる。<br>
<br>
==== LINQ to JSON : JSONファイルの読み込み ====
==== LINQ to JSON : JSONファイルの読み込み ====
以下の例では、LINQ to JSON、非同期処理、ストリーミング処理を使用して、JSONファイルの読み込んでいる。<br>
以下の例では、LINQ to JSON、非同期処理、ストリーミング処理を使用して、JSONファイルの読み込んでいる。<br>
456行目: 524行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
以下の例では、上記のクラスを使用してJSONファイルを読み込んでいる。<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  class Program
  class Program
464行目: 533行目:
       var reader = new JsonReader();
       var reader = new JsonReader();
       await reader.ReadJsonFileAsync("sample.json");
       await reader.ReadJsonFileAsync("sample.json");
    }
}
</syntaxhighlight>
<br>
==== LINQ to JSON : JSONファイルの書き込み ====
以下の例では、LINQ to JSON、非同期処理、ストリーミング処理を使用して、JSONファイルの書き込んでいる。<br>
<br>
FileStreamクラスを使用してストリーミング処理することにより、大きなJSONファイルを扱う場合にもメモリ効率が向上している。<br>
<br>
* 書き込むJSONファイル
<syntaxhighlight lang="json">
{
    "appDesc": {
      "description": "SomeDescription",
      "message": "SomeMessage"
    },
    "appName": {
      "description": "Home",
      "message": "Welcome",
      "imp":["awesome","best","good"]
    }
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class JsonWriter
{
    public async Task WriteJsonFileAsync(string filePath, JObject jsonObject)
    {
      try
      {
          using (var fileStream = File.Create(filePath))
          using (var streamWriter = new StreamWriter(fileStream))
          using (var jsonWriter = new JsonTextWriter(streamWriter))
          {
            jsonWriter.Formatting = Formatting.Indented;
            await jsonObject.WriteToAsync(jsonWriter);
          }
          Console.WriteLine("JSONファイルの書き込みが完了");
      }
      catch (IOException ex)
      {
          Console.WriteLine($"エラー: ファイルの書き込み中にエラーが発生: {ex.Message}");
      }
      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)
    {
      // JSONファイルの書き込み
      var writer = new JsonWriter();
      var jsonObject = new JObject
      {
          ["appDesc"] = new JObject
          {
            ["description"] = "SomeDescription",
            ["message"] = "SomeMessage"
          },
          ["appName"] = new JObject
          {
            ["description"] = "Home",
            ["message"] = "welcome",
            ["imp"] = new JArray { "awesome", "best", "good" }
          }
      };
      await writer.WriteJsonFileAsync("sample.json", jsonObject);
    }
}
</syntaxhighlight>
<br>
==== LINQ to JSON : JSONファイルの変更 ====
以下の例では、下記に示すJSONファイルの"appName"オブジェクトの"imp"配列の値を["hoge", "piyo"]に変更している。<br>
<br>
* 変更前のJSONファイル
<syntaxhighlight lang="json">
{
    "appDesc": {
      "description": "SomeDescription",
      "message": "SomeMessage"
    },
    "appName": {
      "description": "Home",
      "message": "Welcome",
      "imp":["awesome","best","good"]
    }
}
</syntaxhighlight>
<br>
# JsonModifierクラスのインスタンスを生成する。
# JSONファイルを読み込み、JObject.Parseメソッドを使用してJSONオブジェクトに変換する。
# JSONオブジェクトから、jsonObject["appName"]["imp"] = new JArray("hoge", "piyo");を使用して、"appName"オブジェクトの"imp"配列の値を["hoge", "piyo"]に変更する。
# 変更したJSONオブジェクトを新しいファイルに書き込む。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class JsonModifier
{
    public async Task ModifyAndWriteJsonFileAsync(string inputFilePath, string outputFilePath)
    {
      try
      {
          // JSONファイルを読み込む
          string jsonContent = await File.ReadAllTextAsync(inputFilePath);
          JObject jsonObject = JObject.Parse(jsonContent);
          // appName.impの配列を変更 (LINQ to JSONを使用する場合)
          jsonObject["appName"]["imp"] = new JArray("hoge", "piyo");
          // appName.impの配列を変更 (通常のLINQを使用する場合)
          //var appNameObjects = jsonObject.Descendants()
          //      .OfType<JProperty>()
          //      .Where(p => p.Name == "appName")
          //      .Select(p => p.Value as JObject);
          //foreach (var appName in appNameObjects)
          //{
          //  if (appName != null && appName["imp"] is JArray impArray)
          //  {
          //      // "imp"配列の内容を変更
          //      impArray.Replace(new JArray("hoge", "piyo"));
          //  }
          //}
          // 変更したJSONを新しいファイルに書き込む
          await WriteJsonFileAsync(outputFilePath, jsonObject);
      }
      catch (FileNotFoundException ex)
      {
          Console.WriteLine($"エラー: 入力ファイルが存在しない: {ex.Message}");
      }
      catch (JsonException ex)
      {
          Console.WriteLine($"エラー: JSONの解析中にエラーが発生: {ex.Message}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
    public async Task WriteJsonFileAsync(string filePath, JObject jsonObject)
    {
      try
      {
          using (var fileStream = File.Create(filePath))
          using (var streamWriter = new StreamWriter(fileStream))
          using (var jsonWriter = new JsonTextWriter(streamWriter))
          {
            jsonWriter.Formatting = Formatting.Indented;
            await jsonObject.WriteToAsync(jsonWriter);
          }
          Console.WriteLine("JSONファイルの書き込みが完了");
      }
      catch (IOException ex)
      {
          Console.WriteLine($"エラー: ファイルの書き込み中にエラーが発生: {ex.Message}");
      }
      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 inputFilePath  = "sample.json";
      string outputFilePath = "newsample.json";
      var jsonModifier = new JsonModifier();
      await jsonModifier.ModifyAndWriteJsonFileAsync(inputFilePath, outputFilePath);
     }
     }
  }
  }