まずはJSONのリード(デシリアライズ)
普通のテキストファイルが読めたので次はJSONのリード
こんなJsonファイルを準備(適当すぎるかも?)まあ、ネストもしてるし配列もカバーできてるのでいいかな
{
"count": "最初",
"tablename": {
"colmn1": "カラム1",
"colmn2": "カラム2"
},
"args": [
{
"name": "太郎",
"age": 25
},
{
"name": "二郎",
"age": 22
}
]
}
JSONファイルはちゃんとタグが書けてないとリードするときにエラーになったりするので、確認できる手段が必要だけど何時もFirefoxで確認してます
何で他のブラウザーは対応してくれないのかねぇこんな感じで自分の狙ったとおりになっていたらファイルはOK(上の画像はこの後編集したので項目名が変ですけど)
これをtestfile.jsonとか名前を付けてResources/Raw/ に配置
このtestfile.jsonのプロパティを確認してMauiAssetになってればいいけどそうなってなかったらMauiAssetに修正
で、ちょっとびっくりした機能
こちらのページで紹介されていたのだけど、
jsonファイルの中身をクリップボードにコピーして
「編集」→「形式を選択して貼り付け」→「JSONをクラスとして貼り付ける」
とすると
先頭にusingを入れる
useiusing System.Text.Json;
using System.Text.Json.Serialization;
public class Rootobject
{
public string count { get; set; }
public Tablename tablename { get; set; }
public Arg[] args { get; set; }
}
public class Tablename
{
public string colmn1 { get; set; }
public string colmn2 { get; set; }
}
public class Arg
{
public string name { get; set; }
public int age { get; set; }
}
と言うコードが自動生成されてしまう
マジかよ・・・・
クラス内のネストとか名前を適当に付けられてしまうので、そこは後で修正するとしてコーディングしてみましょうか
JSONリード用のボタン追加
<Button
x:Name="JsonRead"
Text="JSONリード"
Clicked="JsonRead_Clicked"
HorizontalOptions="Center"/>
private async void JsonRead_Clicked(object sender, EventArgs e)
{
using var stream = await FileSystem.OpenAppPackageFileAsync("testfile.json");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
Rootobject testJsonObj = JsonSerializer.Deserialize<Rootobject>(contents);
}
んー、なんかわざわざ非同期で読み込む必要は無い気もするけどどうしよう
おお、ちゃんと読めている
まあ当たり前なんだけどね。
WindowsでもAndroidでも読めました
じゃあもうちょっと使いやすい形にしましょうか
というわけでまずJSONファイル
{
"見出し": "最初",
"ネスト": {
"項目(1番)": "カラム1",
"項目(2番)": "カラム2"
},
"個人情報": [
{
"名前": "太郎",
"年齢": 25
},
{
"名前": "二郎",
"年齢": 100
}
]
}
コードも色々修正
public class Rootobject
{
[JsonPropertyName("見出し")]
public string title { get; set; }
[JsonPropertyName("ネスト")]
public NestedTable tablename { get; set; }
[JsonPropertyName("個人情報")]
public Persons[] args { get; set; }
}
public class NestedTable
{
[JsonPropertyName("項目(1番)")]
public string colmn1 { get; set; }
[JsonPropertyName("項目(2番)")]
public string colmn2 { get; set; }
}
public class Persons
{
private int _age;
[JsonPropertyName("名前")]
public string name { get; set; }
[JsonPropertyName("年齢")]
public int age
{
get => _age;
set
{
_age= value >=50 ? 50 : value;
}
}
}
とは言えJSONを取り込むクラスの各カラムに[JsonPropertyName("hogehoge")]と言うプロパティを付けて
これを修正したJSONファイルの項目名と一致させただけ
後は年齢は50以上は認めない・・・・とかちょっと実験用のコード修正も入れてあるけど
なんかもっとスマートな記述は無いものかね
それとAndroidの実行中にcsファイルの編集すると中途半端にホットリロードが効いたり効かなかったりする基準を知りたい・・・・
えるいーだーの実装としてはこれで充分だけど、デバッグ用にデータを吐き出すときにそれでは困るので・・・
コメント
コメントを投稿