Serializando objetos para JSON em C#

Olá Caríssimos,

No post de hoje quero dar um exemplo de código de como fazemos para criar uma função genérica para serializar e deserializar objetos para JSON utilizando C#.

Eu utilizo a biblioteca JSON .NET que pode ser encontrada aqui: http://json.codeplex.com/ . Em um post já falei um pouco porque utilizo esta biblioteca (veja aqui), ela tem várias opções de configuração e conseguimos controlar melhor a forma como os objetos são serializados.

Bem, mãos nos bits e vamos lá:

public static string Serialize<T>(T value) where T : class
{

Type type = value.GetType();
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();

//ignorando propriedades nulas
json.NullValueHandling = NullValueHandling.Ignore;

// ignorar referencias ciclicas em objetos
json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// formato da data, utilizar o iso
json.DateFormatHandling = DateFormatHandling.IsoDateFormat;

if (type == typeof(DataTable))
json.Converters.Add(new DataTableConverter());
else if (type == typeof(DataSet))
json.Converters.Add(new DataSetConverter());

StringWriter sw = new StringWriter();
Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);

writer.Formatting = Formatting.None;

writer.QuoteChar = '"';
json.Serialize(writer, value);

string output = sw.ToString();
writer.Close();
sw.Close();

return output;

}
public static T DeSerialize<T>(string value) where T : class
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
// se alguma propriedade nao existir no objeto, ignorar
settings.MissingMemberHandling = MissingMemberHandling.Ignore;

return JsonConvert.DeserializeObject<T>(value);

}

No código acima temos as funções. Para utilizar podemos utilizar desta forma:

public static void Main(string[] args)
{

DataTable dt = new DataTable();
dt.Columns.Add("Teste");
dt.Columns.Add("Data", typeof(DateTime));
dt.Columns.Add("Complemento");
dt.LoadDataRow(new object[] { "Teste 1", DateTime.Now, "Complemento1" }, true);
dt.LoadDataRow(new object[] { "Teste 2", DateTime.Now, "Complemento1" }, true);
dt.LoadDataRow(new object[] { "Teste 3", DateTime.Now, "Complemento1" }, true);
dt.LoadDataRow(new object[] { "Teste 4", DateTime.Now, null }, true);
string json = Serialize<DataTable>(dt);

List<Teste> values = new List<Teste>();
values.Add(new Teste { Data = DateTime.Now, Idade = 12, Nome = "Teste" });
values.Add(new Teste { Data = DateTime.Now, Idade = 12, Nome = "Teste" });
values.Add(new Teste { Data = DateTime.Now, Idade = 12, Nome = "Teste" });
values.Add(new Teste { Data = DateTime.Now, Idade = 12, Nome = "Teste" });
values.Add(new Teste { Data = DateTime.Now, Idade = 12, Nome = "Teste" });
string json1 = Serialize<List<Teste>>(values);



}</pre>

Só uma observação: quando serializamos um DataTable, podemos deserializar como um List<Dictionary<TKey,TValue>>.

 

Por hoje é isso.

 

Até a próxima.

Anúncios

, , ,

  1. #1 por washington bomfim em 14 de agosto de 2017 - 10:54 am

    Cara, tem um ano que procuro alguma coisa sobre como não serializar atributos nulos de objetos em c# e não encontro nada, finalmente uma luz, kk. Porem ainda continua serializando os atributos inteiros, mais acredito que seja pelo fato de não serem nulos né, e sim 0, acho que este problema não tem como resolver mais se souber de algo, serei grato.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: