スキップしてメイン コンテンツに移動

.Net MAUIでJSONを読もう(2/3)

前のページからの続き

まずは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"/>


csファイルも修正

    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ファイルの編集すると中途半端にホットリロードが効いたり効かなかったりする基準を知りたい・・・・

えるいーだーの実装としてはこれで充分だけど、デバッグ用にデータを吐き出すときにそれでは困るので・・・

JSONのライトは次のページに続く・・・

コメント