Як написати файл JSON у C #?


146

Мені потрібно записати такі дані у текстовий файл у форматі JSON на C #. Дужки важливі для того, щоб він був дійсним форматом 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;}
}

Відповіді:


276

Я рекомендую 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 у файл


Чому? Ось порівняння особливостей між звичайними серіалізаторами, а також тестовими показниками † ‡.

Нижче наведено графік ефективності, взятий із пов'язаної статті:

введіть тут опис зображення

У цьому окремому дописі зазначено, що:

Json.NET завжди був ефективним у пам’яті, використовуючи потокове читання та запис великих документів, а не завантажуючи їх цілком у пам’ять, але мені вдалося знайти пару ключових місць, де можна було б зменшити розміщення об’єктів ...... (зараз) Json.Net (6.0) виділяє у 8 разів менше пам'яті, ніж JavaScriptSerializer


Оновлення з .Net Core 3.0

Нова дитина в блоці з моменту написання цього, System.Text.Jsonщо було додано до. Net Core 3.0. Microsoft висловлює кілька претензій на те, як це зараз краще, ніж Newtonsoft . У тому числі, що він швидший, ніж Newtonsoft . як зазначено вище, я б радив вам перевірити це самостійно .

† Орієнтовні показники виглядають як Json.Net 5, поточна версія (у письмовій формі) - 10. Яка версія стандартних серіалізаторів .Net використовується не згадується

‡ Ці тести очевидно від розробників, які підтримують бібліотеку. Я не підтвердив їхні претензії . Якщо ви сумніваєтесь, протестуйте їх самостійно.


1
Чим JSON.NET відрізняється від вбудованої підтримки, що надається класами JavaScriptSerializerта DataContractJsonSerializer?
Роберт Харві

2
У посилання Json.Net на @RobertHarvey Liam є приємна таблиця, на якій відображені відмінності. Виходячи з людей, які це роблять, звичайно, слід брати його із зерном солі, але це справді краще, ніж вбудовані речі.
Тім С.

1
Так, мені потрібно додавати до файлу знову і знову, але вони повинні бути все в одному масиві
user1429595

1
У такому випадку вам потрібно буде прочитати файл, розібрати його на об'єкти, додати до об'єктів, а потім проаналізувати його знову.
Ліам

4
@Drew Noakes Якщо ви хочете зробити запис у файл, не поклавши його в пам'ять спочатку, спробуйте це написати з JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828

62

Приклад у відповіді Ліама зберігає файл як рядок в одному рядку. Я вважаю за краще додавати форматування. Хтось у майбутньому може захотіти змінити якесь значення у файлі вручну. Якщо ви додасте форматування, це зробити простіше.

Далі додається базовий відступ JSON:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);


4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.