Compartir a través de


Ejemplo de serialización JSON con establecimiento flexible de tipos

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 Cómo serializar y deserializar datos JSON.

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.

Bb943471.note(es-es,VS.100).gifNota:
El procedimiento de instalación y las instrucciones de compilació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 Asignación entre JSON y XML.

Bb943471.note(es-es,VS.100).gifNota:
La clase JsonObject solo 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 Asignación entre JSON y 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, compilar y ejecutar el ejemplo

  1. Asegúrese de realizar los Procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Compile la solución WeaklyTypedJson.sln tal y como se describe en Compilación de los ejemplos de Windows Communication Foundation.

  3. Ejecute la solución.

Bb943471.Important(es-es,VS.100).gif Nota:
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.

<InstallDrive>:\WF_WCF_Samples

Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de WF e Windows Communication Foundation (WCF). Este ejemplo se encuentra en el siguiente directorio.

<InstallDrive>:\WF_WCF_Samples\WCF\Scenario\Ajax\WeaklyTypedJson