(同じ利用者による、間の4版が非表示)
392行目: 392行目:
*: https://www.newtonsoft.com/json
*: https://www.newtonsoft.com/json
<br>
<br>
==== Newtonsoft.Json (Json.NET) ライブラリのインストール ====
==== Newtonsoft.Json (Json.NET) ライブラリのインストール ====
RiderまたはVisual StudioからNuGetを使用して、Json.NETライブラリをインストールする。<br>
RiderまたはVisual StudioからNuGetを使用して、Json.NETライブラリをインストールする。<br>
442行目: 443行目:
また、大きなサイズなJSONファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
また、大きなサイズなJSONファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
<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>
608行目: 621行目:
   
   
       await writer.WriteJsonFileAsync("sample.json", jsonObject);
       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);
     }
     }
  }
  }