Ukázka slabě typované serializace JSON
Při serializaci uživatelem definovaného typu do daného formátu drátu nebo deserializace drátového formátu zpět do uživatelem definovaného typu musí být daný typ definovaný uživatelem dostupný v rámci služby i klienta. K tomuto účelu DataContractAttribute se obvykle použije atribut u těchto uživatelem definovaných typů a DataMemberAttribute atribut se použije na jejich členy. Tento mechanismus platí také při práci s objekty JSON (JavaScript Object Notation), jak je popsáno v tématu Postupy: Serializace a Deserializace dat JSON.
V některých scénářích musí služba Windows Communication Foundation (WCF) nebo klient přistupovat k objektům JSON vygenerovaným službou nebo klientem, který není pod kontrolou vývojáře. Vzhledem k tomu, že více webových služeb veřejně zpřístupňuje rozhraní JSON API, může být pro vývojáře WCF nepraktické vytvářet místní uživatelem definované typy, do kterých se mají deserializovat libovolné objekty JSON.
Ukázka WeaklyTypedJson poskytuje mechanismus, který vývojářům WCF umožňuje pracovat s deserializovanými libovolnými objekty JSON bez vytváření uživatelsky definovaných typů. To se označuje jako slabě typovaná serializace objektů JSON, protože typ, do kterého objekt JSON deserializuje, není v době kompilace znám.
Například rozhraní API veřejné webové služby vrátí následující objekt JSON, který popisuje některé informace o uživateli služby.
{"personal": {"name": "Paul", "age": 23, "height": 1.7, "isSingle": true, "luckyNumbers": [5,17,21]}, "favoriteBands": ["Band ABC", "Band XYZ"]}
Chcete-li deserializovat tento objekt, musí klient WCF implementovat následující uživatelem definované typy.
[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;
}
To může být těžkopádné, zejména pokud klient musí zpracovat více než jeden typ objektu JSON.
Typ JsonObject
poskytnutý touto ukázkou představuje slabě zadanou reprezentaci deserializovaného objektu JSON. JsonObject
spoléhá na přirozené mapování mezi objekty JSON a slovníky rozhraní .NET Framework a mapování mezi poli JSON a poli rozhraní .NET Framework. Následující kód ukazuje JsonObject
typ.
// 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]
};
Všimněte si, že objekty a pole JSON můžete procházet bez nutnosti deklarovat jejich typ v době kompilace. Vysvětlení požadavku na objekt nejvyšší úrovně ["root"]
najdete v tématu Mapování mezi JSON a XML.
Poznámka:
Třída JsonObject
je poskytována pouze jako příklad. Nebyla důkladně testována a neměla by se používat v produkčních prostředích. Zjevné implikace slabě typované serializace JSON je nedostatek bezpečnosti typů při práci s JsonObject
.
Chcete-li použít JsonObject
typ, musí kontrakt operace klienta použít Message jako jeho návratový typ.
[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();
}
Následně se JsonObject
vytvoří instance, jak je znázorněno v následujícím kódu.
// 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);
Konstruktor JsonObject
přebírá XmlDictionaryReader, který je získán prostřednictvím GetReaderAtBodyContents metody. Čtečka obsahuje reprezentaci XML zprávy JSON přijaté klientem. Další informace najdete v tématu Mapování mezi JSON a XML.
Program vytvoří následující výstup:
Service listening at http://localhost:8000/.
To view the JSON output from the sample, navigate to http://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.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Sestavte řešení WeaklyTypedJson.sln, jak je popsáno v části Sestavení ukázek Windows Communication Foundation.
Spusťte řešení.