Ejemplo de serialización JSON con establecimiento flexible de tipos

Download sample

Al serializar un tipo definido por el usuario en un formato de conexión determinado o deserializar un formato de conexión en un tipo definido por el usuario, el tipo definido por el usuario determinado debe estar disponible en el servicio y en el cliente. Normalmente, para lograr esto, se aplica el atributo DataContractAttribute a estos tipos definidos por el usuario y el atributo DataMemberAttribute se aplica a sus miembros. Este mecanismo también se aplica al trabajar con los objetos JSON (JavaScript Object Notation), tal y como se describe en el tema How to: Serialize and Deserialize JSON Data.

En algunos escenarios, un servicio o cliente Windows Communication Foundation (WCF) debe tener acceso a los objetos JSON generados por un servicio o cliente que está fuera del control del desarrollador. Ya que cada vez hay más servicios web que exponen públicamente las API de JSON, se puede volver muy poco práctico para el desarrollador de WCF construir los tipos locales definidos por el usuario en los que deserializar los objetos JSON arbitrarios. Este ejemplo proporciona un mecanismo que permite a los desarrolladores de WCF trabajar con objetos JSON deserializados y arbitrarios sin crear tipos definidos por el usuario. Esto se conoce como serialización con establecimiento flexible de tipos de objetos JSON, porque no se conoce el tipo en el que un objeto JSON se deserializa en el momento de la compilación.

Nota

En este ejemplo, para generar y ejecutar, es necesario que esté instalado .NET Framework versión 3.5. Para abrir los archivos de solución y proyecto se necesita Visual Studio 2008.

Nota

Las instrucciones de compilación y el procedimiento de instalación de este ejemplo se encuentran al final de este tema.

Por ejemplo, una API pública de servicio web devuelve el siguiente objeto JSON, que describe información sobre un usuario del servicio.

{"personal": {"name": "Paul", "age": 23, "height": 1.7, "isSingle": true, "luckyNumbers": [5,17,21]}, "favoriteBands": ["Band ABC", "Band XYZ"]}

Para deserializar este objeto, un cliente WCF debe implementar los tipos siguientes definidos por el usuario.

   [DataContract]
    public class MemberProfile
    {
        [DataMember]
        public PersonalInfo personal;

        [DataMember]
        public string[] favoriteBands;
    }

    [DataContract]
    public class PersonalInfo
    {
        [DataMember]
        public string name;

        [DataMember]
        public int age;

        [DataMember]
        public double height;

        [DataMember]
        public bool isSingle;

        [DataMember]
        public int[] luckyNumbers;
    }

Esto puede ser embarazoso, sobre todo si el cliente tiene que administrar más de un tipo de objeto JSON.

El tipo JsonObject proporcionado por este ejemplo introduce una representación con establecimiento flexible de tipos del objeto JSON deserializado. JsonObject confía en la asignación natural entre los objetos JSON y diccionarios .NET Framework, y la asignación entre las matrices JSON y .NET Framework. En el código siguiente se muestra el tipo JsonObject:

// Instantiation of JsonObject json omitted

string name = json["root"]["personal"]["name"];
int age = json["root"]["personal"]["age"];
double height = json["root"]["personal"]["height"];
bool isSingle = json["root"]["personal"]["isSingle"];
int[] luckyNumbers = {
                                     json["root"]["personal"]["luckyNumbers"][0],
                                     json["root"]["personal"]["luckyNumbers"][1],
                                     json["root"]["personal"]["luckyNumbers"][2] 
                                 };
string[] favoriteBands = {
                                        json["root"]["favoriteBands"][0],
                                        json["root"]["favoriteBands"][1]
                                    };

Observe que puede examinar los objetos y matrices JSON sin necesidad de declarar el tipo en el momento de la compilación. Para ver una explicación del requisito para el objeto ["root"] de nivel superior, consulte el tema Mapping Between JSON and XML.

Nota

La clase JsonObject sólo se proporciona como un ejemplo. No se ha probado en profundidad y no debería usarse en entornos de producción. Una implicación obvia de serialización de JSON con establecimiento flexible de tipos es la falta de seguridad de tipos al trabajar con JsonObject.

Para utilizar el tipo JsonObject, el contrato de operación del cliente debe utilizar Message como su tipo de valor devuelto.

[ServiceContract]
    interface IClientSideProfileService
    {
        // There is no need to write a DataContract for the complex type returned by the service.
        // The client will use a JsonObject to browse the JSON in the received message.

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        Message GetMemberProfile();
    }

Se crean instancias de JsonObject a continuación tal y como se muestran en el código siguiente.

// Code to instantiate IClientSideProfileService channel omitted…

// Make a request to the service and obtain the Json response
XmlDictionaryReader reader = channel.GetMemberProfile().GetReaderAtBodyContents();

// Go through the Json as though it is a dictionary. There is no need to map it to a .NET CLR type.
JsonObject json = new JsonObject(reader);

El constructor JsonObject toma un XmlDictionaryReader, que se obtiene a través del método GetReaderAtBodyContents. El lector contiene una representación XML del mensaje de JSON recibida por el cliente. Para obtener más información, vea del tema Mapping Between JSON and XML.

El programa produce el siguiente resultado:

Service listening at https://localhost:8000/.
To view the JSON output from the sample, navigate to https://localhost:8000/GetMemberProfile
This is Paul's page. I am 23 years old and I am 1.7 meters tall.
I am single.
My lucky numbers are 5, 17, and 21.
My favorite bands are Band ABC and Band XYZ.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Genere la solución WeaklyTypedJson.sln tal y como se describe en Generación de ejemplos de Windows Communication Foundation.

  3. Ejecute la solución.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.