Embedded Resource
としてアプリケーションに埋め込むJSON
テキストファイルとしてファイルを保存することもできます。例えば、以下のようにサンプルJSONファイルを使用して
:
{
"Data": [
{
"Title": "Title 1",
"Description": "Description 1",
"Developer": "Developer 1",
"Year": 1996
},
{
"Title": "Title 2",
"Description": "Description 2",
"Developer": "Developer 2",
"Year": 1997
},
{
"Title": "Title 3",
"Description": "Description 3",
"Developer": "Developer 3",
"Year": 1998
}
]
}
次のビルドアクションを変更することによって、あなたのソリューションにこれを埋め込むことができます(プロパティのペイン)Embedded Resource
に、これはあなたにあなたにJSONデータファイルを埋め込みますアセンブリ出力。
次に、JSON.Net
を使用してデータをデシリアライズしてDataset
にすることができます。
public static DataSet LoadData()
{
var asm = typeof(Program).Assembly;
var jsonText = "";
using(var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.data.json"))
{
using (var reader = new StreamReader(stream))
{
jsonText = reader.ReadToEnd();
}
}
DataSet dataSet = null;
try
{
dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
}
catch
{
}
return dataSet;
}
上記の方法はかなり簡単です。まず、JSONデータ(ファイル名はdata.json
)をアセンブリから読み込みます。ファイルへのパスはYourNameSpace.<FileName>
である必要があります。JsonConvert.DeserializeObject<DataSet>()
を使用して、JSONテキストをDataset
オブジェクトに変換して返します。結果には、アプリケーションで使用できるData
(JSONファイルのルートノード)という1つのテーブルが含まれます。
これで、データを追加するためにJSONファイルに追加するだけで済みます。今度はこのファイルをアセンブリ(exe)にインクルードし、追加ファイルを持たずに、アプリケーションに埋め込まれたデータを書き込むことはできません。
ただし、書き込みアクセスが必要な場合は、ファイルがアプリケーションパスに存在するかどうかを(起動時に)検出できます。存在しない場合は、デフォルトのデータファイルを読み取り、その内容を以下のような出力ファイルに書き込むことができます。我々は、ファイルが現在のアプリケーションディレクトリに存在するかどうかを最初にチェックすることによってDataset
をロードする上記のコード例で
public static DataSet LoadDataSet()
{
var asm = typeof(Program).Assembly;
string filePath = Path.GetDirectoryName(asm.CodeBase).ToLowerInvariant().Replace(@"file:\", "");
filePath = Path.Combine(filePath, "data.json");
string jsonText = null;
if (!File.Exists(filePath))
{
using (var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.data.json"))
{
using (var fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite))
{
stream.CopyTo(fs);
}
}
}
else
jsonText = File.ReadAllText(filePath);
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
return dataSet;
}
public static void SaveDataSet(DataSet dataSet)
{
var asm = typeof(Program).Assembly;
string filePath = Path.GetDirectoryName(asm.CodeBase).ToLowerInvariant().Replace(@"file:\", "");
filePath = Path.Combine(filePath, "data.json");
string jsonText = JsonConvert.SerializeObject(dataSet, Formatting.Indented);
File.WriteAllText(filePath, jsonText);
}
。存在しない場合は、FileStream
を使用して、埋め込みリソースからディスクに内容を効果的にコピーしています。
次に、File.ReadAllText()
を呼び出して、ディスクから内容を読み取り、それをpreviousメソッドを使用してデータセットに変換することができます。
変更をデータセットに保存する方法があります。リソースがアプリケーションに埋め込まれると、アセンブリ内のバージョンを変更することはできませんが、ディスク上のファイルを上書きすることができます。
[Rows.Add](https://docs.microsoft.com/en-us/dotnet)を使用することができます。/framework/data/adonet/dataset-datatable-dataview/add-data-to-a-datatable)を使用して1つのステートメントに行の値を追加することはできますが、200行であってもこれは面倒な作業です。データベースを必要としない場合は、単純なテキストファイルを使用できます。 –