Página Inicial > .NET, Livros > Serialização de objetos em JSON com .NET

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.


.NET, Livros , , ,

  1. Mauricio
    25, outubro, 2009 em 21:34 | #1

    Muito bom você ter compartilhado este código, será uma excelente referência quando precisarmos uitlizá-los em outras partes do projeto.

  2. Bruno
    20, janeiro, 2010 em 09:34 | #2

    Foi util pra mim.
    ps: Ja naum sou um sangue suga neh rs

  3. 20, janeiro, 2010 em 13:04 | #3

    Com certeza não é.
    Obrigado pelo comentário.

  4. Jairo
    2, abril, 2014 em 16:32 | #4

    Obrigado, meu caro!

  5. 2, março, 2015 em 08:54 | #5

    Prodis, estou com uma dúvida para serializar dados retornados de uma consulta ao Entity Framework, o mesmo retorna uma coleção dentro de um objeto por conta do relacionamento com outra tabela, e não estou conseguindo efetuar a serialização por conta disso, vc teria como dar uma dica de como proceder nesses casos?

  6. 25, março, 2015 em 23:28 | #6

    @Roberto Ramos
    Desculpe, mas já faz muito tempo que não desenvolvo com .NET. Sugiro que você procure por sua dúvida no Stack Overflow.

  1. 28, outubro, 2009 em 07:55 | #1
  2. 13, dezembro, 2009 em 18:23 | #2