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. Deixe um comentário

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: