このページは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の下のパッケージのところ
で、中身は・・・
なんじゃこりゃーーーーこれでもちゃんとしたファイルみたいだ
いやびっくり
どうも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"
},
"個人情報": [
{
"名前": "太郎"
},
{
"名前": "二郎"
}
]
}
やったね
おしまい
コメント
コメントを投稿