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

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

前のページからの続き

このページはJSONでファイルを読んだ後の話で、JSONにデータの内容を書き出す話です
リードだけしたい人には無関係な話です

じゃあJSONのライト(シリアライズ)

とは言え、何処に書くんだという話があるわけで
まさか/Resourceに書くわけにはいかないわけです

マイクロソフトのサイトを参考に「これを使え
となっているのでFileSystem.Current.AppDataDirectoryを使用してデータフォルダのルートを取得

そして、それを踏まえてシリアライズのコード
今度はライトのボタンを追加

            <Button
                x:Name="JsonWrite"
                Text="JSONライト"
                Clicked="JsonWrite_Clicked" />

リードしたデータを書き込む形にしたので、リード側もちょっと修正
んで、このプログラムはリードボタンをクリックしてからライトしないとまともに動作しないので悪しからず

    Rootobject _testJsonObj;

    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();

        _testJsonObj = JsonSerializer.Deserialize<Rootobject>(contents);
    }

    private void JsonWrite_Clicked(object sender, EventArgs e)
    {
        string fileName = "testfile.json";                  //ファイル名
        string mainDir = FileSystem.Current.AppDataDirectory;//アプリのデータフォルダ取得
        string fullpath = Path.Combine(mainDir, fileName);  //パスの合成

        string jsonString = JsonSerializer.Serialize(_testJsonObj); //シリアライズ(options追加)
        File.WriteAllText(fullpath, jsonString );           //書込
    }

上手く行った・・ぽいけど何処にファイルが出来たのだろう・・・・と思ったら

もの凄いところに出来ていた・・・(windowsの場合)
androidは/data/dataの下のパッケージのところ

で、中身は・・・

なんじゃこりゃーーーー

でもfirefoxではきっちり読める

これでもちゃんとしたファイルみたいだ
いやびっくり

どうもUTF-8でシリアライズするためにはちょっと細工が必要みたい
マイクロソフトのページにあった

JsonSerializerOptionに色々設定してからシリアライザーにオプションとして渡すと上手く行った

    private void JsonWrite_Clicked(object sender, EventArgs e)
    {
        string fileName = "testfile.json";                  //ファイル名
        string mainDir = FileSystem.Current.AppDataDirectory;//アプリのデータフォルダ取得
        string fullpath = Path.Combine(mainDir, fileName);  //パスの合成

        var options = new JsonSerializerOptions
        {
            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),  //全ての文字コード受入
            WriteIndented = true,                                   //文字の改行、整列
        };

        string jsonString = JsonSerializer.Serialize(_testJsonObj, options); //シリアライズ(options追加)
   
        File.WriteAllText(fullpath, jsonString );           //書込

    }

 後はファイル出力したくないメンバ名を設定するオプションはあるはずだよなぁ(NewtonsoftのJSON.NETにはあった)ととシリアライザーのクラスを眺めていたらそれっぽい物を発見

JsonIgnoreAttribute クラス
これをJSONに出力したくないメンバ名のところに設定してやる

    public class Persons
    {
        private int _age;

        [JsonPropertyName("名前")]
        public string name { get; set; }

        [JsonPropertyName("年齢"), JsonIgnoreAttribute]
        public int age
        {
            get => _age;
            set
            {
                _age= value >=50 ? 50 : value;
            }
        }
    }

Personsクラスの年齢のところ追加
するとどうでしょうファイル出力すると

年齢が消え去っているのです

{
  "見出し": "最初",
  "ネスト": {
    "項目(1番)": "カラム1",
    "項目(2番)": "カラム2"
  },
  "個人情報": [
    {
      "名前": "太郎"
    },
    {
      "名前": "二郎"
    }
  ]
}

やったね

おしまい

 

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13