Serialização de objetos em JSON com .NET
Serializar e deserializar instâncias de objetos no formato JSON com .NET acaba sendo muito simples.

Esse é o Jason, não JSON.
Vamos utilizar como exemplo a classe abaixo:
public class SomeFakeClass
{
public int ID { get; set; }
public string Text { get; set; }
public decimal Value { get; set; }
}
E criamos uma instância dela:
SomeFakeClass fake = new SomeFakeClass
{
ID = 123,
Text = "I am a sample text.",
Value = 150.85M
};
Então queremos serializar a variável fake em JSON para obter o seguinte resultado:
{"ID":123,"Text":"I am a sample text.","Value":150.85}
A classe DataContractJsonSerializer torna essa tarefa muito fácil. Basta escrever os dados serializados para um Stream usando o método WriteObject e depois recuperar uma string a partir desse Stream:
MemoryStream stream = new MemoryStream(); DataContractJsonSerializer serializer; serializer = new DataContractJsonSerializer(typeof(SomeFakeClass)); serializer.WriteObject(stream, fake); string json = return Encoding.Default.GetString(stream.ToArray());
Para fazer o inverso, transformar dados em JSON para um objeto, usamos o método ReadObject passando o Stream que possui os dados serializados:
string json = "{"ID":123,"Text":"I am a sample text.","Value":150.85}";
MemoryStream stream = new MemoryStream(json);
DataContractJsonSerializer serializer;
serializer = new DataContractJsonSerializer(typeof(SomeFakeClass));
SomeFakeClass fake = (SomeFakeClass)serializer.ReadObject(stream);
Um detalhe importante é que a partir do .NET Framework 3.5 Service Pack 1 não há mais a necessidade de decorar a classe que queremos serializar com os atributos DataContract e DataMember, como o exemplo abaixo:
[DataContract]
public class SomeFakeClass
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Text { get; set; }
[DataMember]
public decimal Value { get; set; }
}
Isso somente se faz necessário se quisermos ter uma controle maior do que será serializado, como por exemplo, serializar uma propriedade com um nome diferente. Na classe abaixo, a propriedade Text é configurada para ser serializada com o nome Message:
[DataContract]
public class SomeFakeClass
{
[DataMember]
public int ID { get; set; }
[DataMember(Name = "Message")]
public string Text { get; set; }
[DataMember]
public decimal Value { get; set; }
}
Os dados serializados em JSON podem ser algo como:
{"ID":123,"Message":"I am a sample text.","Value":150.85}
Para usar a classe DataContractJsonSerializer, que está no namespace System.Runtime.Serialization.Json, é necessário adicionar referências para dois assemblies no seu projeto:
- System.Runtime.Serialization
- System.ServiceModel.Web
Agora que já sabemos como serializar e deserializar em JSON, podemos criar um utilitário que faz esse trabalho. O exemplo abaixo utiliza Extensions Methods combinados com Generics:
public static class JsonSerializerExtensions
{
public static string ToJson<T>(this T obj)
{
MemoryStream stream;
using (stream = new MemoryStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, obj);
}
return Encoding.Default.GetString(stream.ToArray());
}
public static T FromJson<T>(this string json)
{
T obj;
using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
obj = (T)serializer.ReadObject(stream);
}
return obj;
}
}
E um exemplo de sua utilização:
SomeFakeClass fake = new SomeFakeClass
{
ID = 123,
Text = "I am a sample text.",
Value = 150.85M
};
string fakeJson = fake.ToJson();
SomeFakeClass otherFake = fakeJson.FromJson<SomeFakeClass>();
.
O código-fonte desse utilitário você pode baixar aqui.


Muito bom você ter compartilhado este código, será uma excelente referência quando precisarmos uitlizá-los em outras partes do projeto.
Foi util pra mim.
ps: Ja naum sou um sangue suga neh rs
Com certeza não é.
Obrigado pelo comentário.