¿Cómo escribir un archivo JSON en C #?

146

Necesito escribir los siguientes datos en un archivo de texto usando el formato JSON en C #. Los corchetes son importantes para que sea un formato JSON válido.

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

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

Aquí está mi clase de modelo:

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}
usuario1429595
fuente

Respuestas:

276

Recomendaría Json.Net , vea el ejemplo a continuación:

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);

O la versión un poco más eficiente del código anterior (no usa una cadena como búfer):

//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);
}

Documentación: serializar JSON a un archivo


¿Por qué? Aquí hay una comparación de características entre los serializadores comunes, así como las pruebas de referencia † ‡.

A continuación se muestra un gráfico del rendimiento tomado del artículo vinculado:

ingrese la descripción de la imagen aquí

Esta publicación separada establece que:

Json.NET siempre ha sido eficiente en la memoria, transmitiendo la lectura y escribiendo documentos grandes en lugar de cargarlos completamente en la memoria, pero pude encontrar un par de lugares clave donde las asignaciones de objetos podrían reducirse ... (ahora) Json.Net (6.0) asigna 8 veces menos memoria que JavaScriptSerializer


Actualización desde .Net Core 3.0

Un nuevo chico en el bloque desde que escribió esto es el System.Text.Jsonque se ha agregado a .Net Core 3.0. Microsoft hace varias afirmaciones de cómo esto es, ahora, mejor que Newtonsoft . Incluyendo que es más rápido que Newtonsoft . como se indicó anteriormente, le aconsejo que pruebe esto usted mismo .

† Los puntos de referencia parecen ser Json.Net 5, la versión actual (en la escritura) es 10. ¿Qué versión de los serializadores .Net estándar utilizados no se menciona?

‡ Estas pruebas son obviamente de los desarrolladores que mantienen la biblioteca. No he verificado sus afirmaciones . En caso de duda, pruébelos usted mismo.

Liam
fuente
1
¿En qué se diferencia JSON.NET del soporte incorporado proporcionado por las clases JavaScriptSerializery DataContractJsonSerializer?
Robert Harvey
2
El enlace Json.Net de @RobertHarvey Liam tiene una buena tabla que muestra cuáles son las diferencias. Viniendo de las personas que lo hacen, por supuesto, debes tomarlo con un grano de sal, pero de hecho es mejor que las cosas integradas.
Tim S.
1
Sí, necesito agregar al archivo una y otra vez, pero deben estar todos en la misma matriz
usuario1429595
1
En ese caso, deberá leer el archivo, analizarlo en objetos, agregarlo a los objetos y luego volver a analizarlo.
Liam
44
@Drew Noakes Si desea escribir en un archivo sin guardarlo primero en la memoria, intente escribir desde JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828
62

El ejemplo en la respuesta de Liam guarda el archivo como una cadena en una sola línea. Prefiero agregar formato. Alguien en el futuro puede querer cambiar algún valor manualmente en el archivo. Si agrega formato, es más fácil hacerlo.

Lo siguiente agrega sangría básica JSON:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
Michał S.
fuente
4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Kulwant Singh
fuente