web-dev-qa-db-ja.com

C#でJSONファイルを書く方法?

C#のJSON形式を使用して、次のデータをテキストファイルに書き込む必要があります。角かっこは、有効なJSON形式であるために重要です。

[
  {
    "Id": 1,
    "SSN": 123,
    "Message": "whatever"

  },
  {
   "Id": 2,
    "SSN": 125,
    "Message": "whatever"
  }
]

これが私のモデルクラスです:

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}
115
user1429595

Json.Net 、下記の例を参照してください。

List<data> _data = new List<data>();
_data.Add(new data()
{
    Id = 1,
    SSN = 2,
    Message = "A Message"
});

string json = JsonConvert.SerializeObject(_data.ToArray());

//write string to file
System.IO.File.WriteAllText(@"D:\path.txt", json);

あるいは、上記のコードをもう少し効率的にしたもの(バッファとして文字列を使用しない):

//open file stream
using (StreamWriter file = File.CreateText(@"D:\path.txt"))
{
     JsonSerializer serializer = new JsonSerializer();
     //serialize object directly into file stream
     serializer.Serialize(file, _data);
}

ドキュメント: JSONをファイルにシリアル化する


どうして?これは一般的なシリアライザとベンチマークテストの間の 機能の比較です †‡。

以下は、リンク先の記事から得られたパフォーマンスのグラフです。

enter image description here 

この 別々の記事 は、次のように述べています。

Json.NETは常にメモリ効率が良く、大きな文書を読み書きしてメモリにロードするのではなくストリーミングしましたが、オブジェクト割り当てを減らすことができる重要な場所をいくつか見つけることができました......(今)Json.Net(6.0)は、JavaScriptSerializerよりも8倍少ないメモリを割り当てます。

‡。

†ベンチマークはJson.Net 5のようです。現在のバージョン(執筆中)は10です。使用されている標準の.NETシリアライザのバージョンは記載されていません

‡これらのテストは明らかにライブラリを保守している開発者によるものです。 申し立てを確認していません。疑わしい場合は自分でテストしてください。

213
Liam

Liamの答えの例では、ファイルを1行の文字列として保存しています。フォーマットを追加することを好みます。将来、誰かがファイル内の値を手動で変更したいと思うかもしれません。フォーマットを追加した方が簡単です。

以下は基本的なJSONインデントを追加します。

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
48
Michał S.

JavaScriptSerializer Class を使った組み込みの機能があります。

var json = JavaScriptSerializer.Serialize(data);
7
Gabe
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
4
Kulwant Singh