サンプルは多数存在するが、階層が1段階のものが多すぎるので記録として
入力したい Json
{
"texts":[
{
"title":"アフターイメージ / After Image",
"subtitle":"Steam (C) 2023 Aurogon Shanghai / Modus Games",
"thumbnail":"afterimage.jpg"
},
{
"title":"ファントムローズ / Phantom Rose",
"subtitle":"Steam (C) 2019 makaroll / Studio Maka",
"thumbnail":"phantomrose.jpg"
},
{
"title":"R-TYPE FINAL3 / 3 EVOLVED",
"subtitle":"PlayStation 5 (C) 2023 Granzella",
"thumbnail":"rtypefinal3.jpg"
}
]
}
texts が配列を持っている形
例えば text/1/title の値は「ファントムローズ / Phantom Rose」
モデルの定義
using System.Text.Json.Serialization;
namespace CSharp_OBSEdit
{
public class settingsJson
{
[JsonPropertyName("texts")]
public IList<childTexts> Texts{get; set;}
}
public class childTexts
{
[JsonPropertyName("title")]
public string Title { get; set; }
[JsonPropertyName("subtitle")]
public string Subtitle { get; set; }
[JsonPropertyName("thumbnail")]
public string Thumbnail {get; set; }
}
}
配列を階層として持つ場合、IList 型を階層としたいクラスで定義する
上記の場合、texts は childTexts クラスのIlist 型とすることで、配列化している
Jsonの読み込み
var oFileJson = new StreamReader(@"※jsonファイルパス",System.Text.Encoding.UTF8);
var vJson = oFileJson.ReadToEnd();
var oJson = System.Text.Json.JsonSerializer.Deserialize<settingsJson>(vJson);
Jsonファイルの読み込みはいくらかあるそうだが、2024/1/28 時点ではこれが良さそうだということで
Newtonsoft.json を扱う方法はレガシー?
やっていることはシンプル
Jsonファイルを vJson にすべて取り込み、System.Text.Json.JsonSerializer.Deserialize で解釈してもらい、
oJson に渡している
型は 先で作った モデルの settingsJson クラスとしている
値の使用
// 値単体
oJson.Texts[1].Title ⇒ ファントムローズ / Phantom Rose
oJson.Texts[2].Subtitle ⇒ PlayStation 5 (C) 2023 Granzella
// 配列なので foreach も可能
foreach(childTexts oJsonLine in oJson.Texts){
oJsonLine.Title ⇒ 1週目なら アフターイメージ / After Image
}
デシリアライズした後はもう基本的な部分になるので説明は略する