Aracılığıyla paylaş


Zayıf yazılmış JSON Seri Hale Getirme Örneği

Kullanıcı tanımlı bir türü belirli bir kablo biçimine seri hale getirdiğinizde veya kablo biçimini yeniden kullanıcı tanımlı bir türe seri durumdan çıkarırken, verilen kullanıcı tanımlı türün hem hizmette hem de istemcide kullanılabilir olması gerekir. Bunu yapmak DataContractAttribute için genellikle özniteliği bu kullanıcı tanımlı türlere uygulanır ve DataMemberAttribute öznitelik üyelerine uygulanır. Bu mekanizma, Nasıl yapılır: JSON Verilerini Seri Hale Getirme ve Seri Durumdan Çıkarma konusunda açıklandığı gibi JavaScript Nesne Gösterimi (JSON) nesneleriyle çalışırken de geçerlidir.

Bazı senaryolarda, bir Windows Communication Foundation (WCF) hizmeti veya istemcisinin, geliştiricinin denetimi dışında olan bir hizmet veya istemci tarafından oluşturulan JSON nesnelerine erişmesi gerekir. Daha fazla Web hizmeti JSON API'lerini genel kullanıma sundıkça, WCF geliştiricisinin rastgele JSON nesnelerinin seri durumdan çıkarıldığı yerel kullanıcı tanımlı türler oluşturması pratik hale gelebilir.

WeaklyTypedJson örneği, WCF geliştiricilerinin kullanıcı tanımlı türler oluşturmadan seri durumdan çıkarılmış, rastgele JSON nesneleriyle çalışmasını sağlayan bir mekanizma sağlar. JSON nesnesinin seri durumdan çıkarıldığı tür derleme zamanında bilinmediğinden bu, JSON nesnelerinin zayıf tür seri hale getirilmesi olarak bilinir.

Örneğin, bir genel Web hizmeti API'si, hizmetin kullanıcısı hakkında bazı bilgileri açıklayan aşağıdaki JSON nesnesini döndürür.

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

Bu nesnenin seri durumdan çıkarılması için, wcf istemcisinin aşağıdaki kullanıcı tanımlı türleri uygulaması gerekir.

[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;
 }

Bu, özellikle istemcinin birden fazla JSON nesnesi türünü işlemesi gerekiyorsa hantal olabilir.

JsonObject Bu örnek tarafından sağlanan tür, seri durumdan çıkarılmış JSON nesnesinin zayıf türlenmiş bir gösterimini tanıtır. JsonObject JSON nesneleri ile .NET Framework sözlükleri arasındaki doğal eşlemeyi ve JSON dizileri ile .NET Framework dizileri arasındaki eşlemeyi temel alır. Aşağıdaki kod türü JsonObject gösterir.

// 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]
                                    };

JSON nesnelerini ve dizilerini derleme zamanında bildirmeye gerek kalmadan "göz atabileceğinizi" unutmayın. En üst düzey ["root"] nesne gereksiniminin açıklaması için JSON ile XML Arasında Eşleme konusuna bakın.

Not

JsonObject sınıfı yalnızca örnek olarak sağlanır. Kapsamlı bir şekilde test edilmemiştir ve üretim ortamlarında kullanılmamalıdır. Zayıf türdeki JSON serileştirmesinin belirgin bir etkisi, ile JsonObjectçalışırken tür güvenliği olmamasıdır.

Türünü kullanmak JsonObject için, istemci işlem sözleşmesinin dönüş türü olarak kullanması Message gerekir.

[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();
    }

JsonObject daha sonra aşağıdaki kodda gösterildiği gibi örneği oluşturulur.

// 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);

JsonObject Oluşturucu, yöntemi aracılığıyla XmlDictionaryReader elde edilen bir GetReaderAtBodyContentsalır. Okuyucu, istemci tarafından alınan JSON iletisinin XML gösterimini içerir. Daha fazla bilgi için JSON ve XML Arasında Eşleme konusuna bakın.

Program aşağıdaki çıkışı oluşturur:

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.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözüm WeaklyTypedJson.sln Windows Communication Foundation Örnekleri Oluşturma bölümünde açıklandığı gibi oluşturun.

  3. Çözümü çalıştırın.