Como escrever um arquivo JSON em C #?

146

Preciso gravar os seguintes dados em um arquivo de texto usando o formato JSON em C #. Os colchetes são importantes para que ele seja válido no formato JSON.

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

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

Aqui está a minha classe de modelo:

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

Respostas:

276

Eu recomendaria o Json.Net , veja o exemplo abaixo:

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

Ou a versão um pouco mais eficiente do código acima (não usa uma string como buffer):

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

Documentation: Serialize JSON para um arquivo


Por quê? Aqui está uma comparação de recursos entre serialisadores comuns e testes de benchmark † ‡.

Abaixo está um gráfico de desempenho extraído do artigo vinculado:

insira a descrição da imagem aqui

Esta postagem em separado afirma que:

O Json.NET sempre foi eficiente em termos de memória, transmitindo a leitura e gravando documentos grandes em vez de carregá-los inteiramente na memória, mas consegui encontrar alguns locais importantes onde as alocações de objetos poderiam ser reduzidas ... (agora) O Json.Net (6.0) aloca 8 vezes menos memória que o JavaScriptSerializer


Atualização desde o .Net Core 3.0

Um novo garoto no mercado desde que escreveu isso System.Text.Jsonfoi adicionado ao .Net Core 3.0. A Microsoft faz várias alegações de como isso é, agora, melhor que a Newtonsoft . Incluindo que é mais rápido que a Newtonsoft . como acima, aconselho você a testar isso sozinho .

† Os benchmarks parecem ser o Json.Net 5, a versão atual (por escrito) é 10. Qual versão dos serializadores padrão do .Net usados ​​não é mencionada

‡ Esses testes são obviamente dos desenvolvedores que mantêm a biblioteca. Eu não verifiquei suas reivindicações . Em caso de dúvida, teste-os você mesmo.

Liam
fonte
1
Como o JSON.NET difere do suporte interno fornecido pelas classes JavaScriptSerializere DataContractJsonSerializer?
Robert Harvey
2
O link Json.Net do @RobertHarvey Liam possui uma boa tabela mostrando quais são as diferenças. Vindo das pessoas que o fazem, é claro que você deve tomá-lo com um grão de sal, mas é realmente melhor do que as coisas embutidas.
Tim S.
1
Sim eu preciso acrescentar ao arquivo uma e outra vez, mas eles precisam ser todos na mesma matriz
user1429595
1
Nesse caso, você precisará ler o arquivo, analisá-lo em objetos, adicioná-lo aos objetos e analisá-lo novamente.
Liam
4
@Drew Noakes Se você quer fazer gravação para um arquivo sem colocá-lo na memória primeiro, tente esta escrita de Json.NET james.newtonking.com/archive/2009/02/14/...
gcoleman0828
62

O exemplo na resposta de Liam salva o arquivo como string em uma única linha. Eu prefiro adicionar formatação. Alguém no futuro pode querer alterar algum valor manualmente no arquivo. Se você adicionar formatação, é mais fácil fazê-lo.

A seguir, adiciona recuo JSON básico:

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