Как написать файл JSON на C #?

156

Мне нужно записать следующие данные в текстовый файл в формате 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;}
}
user1429595
источник

Ответы:

289

Я бы порекомендовал 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
Ссылка @RobertHarvey Liam на Json.Net содержит хорошую таблицу, показывающую различия. Исходя из людей, которые его делают, конечно, вы должны относиться к нему с недоверием, но это действительно лучше, чем встроенные вещи.
Тим С.
1
Да, мне нужно добавлять в файл снова и снова, но все они должны быть в одном массиве
user1429595 04
1
В этом случае вам нужно будет прочитать файл, проанализировать его на объекты, добавить к объектам, а затем снова проанализировать его.
Лиам
4
@Drew Noakes Если вы хотите выполнить запись в файл, не помещая его сначала в память, попробуйте эту запись из JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828
66

Пример в ответе Лиама сохраняет файл как строку в одной строке. Я предпочитаю добавлять форматирование. Кто-то в будущем может захотеть вручную изменить какое-то значение в файле. Если вы добавите форматирование, это сделать проще.

Следующее добавляет базовый отступ JSON:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
Михал С.
источник
5
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Кулвант Сингх
источник