Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Saat menserialisasikan jenis yang ditentukan pengguna ke format kawat tertentu, atau mendeserialisasi format kawat kembali ke jenis yang ditentukan pengguna, jenis yang ditentukan pengguna yang diberikan harus tersedia pada layanan dan klien. Biasanya untuk mencapai hal ini, atribut DataContractAttribute diterapkan ke jenis yang ditentukan pengguna ini dan atribut DataMemberAttribute diterapkan ke anggotanya. Mekanisme ini juga berlaku saat bekerja dengan objek JavaScript Object Notation (JSON), seperti yang dijelaskan dalam topik Cara: Menserialisasi dan Mendeserialisasi Data JSON.
Dalam beberapa skenario, layanan atau klien Windows Communication Foundation (WCF) harus mengakses objek JSON yang dibuat oleh layanan atau klien yang berada di luar kendali pengembang. Karena lebih banyak layanan Web mengekspos API JSON secara publik, dapat menjadi tidak praktis bagi pengembang WCF untuk mengonstruksi tipe yang didefinisikan pengguna secara lokal untuk mendeserialisasi objek JSON arbitrer.
Sampel WeaklyTypedJson menyediakan mekanisme yang memungkinkan pengembang WCF bekerja dengan objek JSON yang dideserialisasi dan arbitrer, tanpa membuat jenis yang ditentukan pengguna. Ini dikenal sebagai serialisasi bertipe lemah dari objek JSON, karena tipe yang didapat setelah objek JSON dideserialisasi sudah tidak diketahui pada waktu kompilasi.
Misalnya, API layanan Web publik mengembalikan objek JSON berikut, yang menjelaskan beberapa informasi tentang pengguna layanan.
{"personal": {"name": "Paul", "age": 23, "height": 1.7, "isSingle": true, "luckyNumbers": [5,17,21]}, "favoriteBands": ["Band ABC", "Band XYZ"]}
Untuk mendeserialisasi objek ini, klien WCF harus menerapkan jenis yang ditentukan pengguna berikut.
[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;
}
Ini bisa rumit, terutama jika klien harus menangani lebih dari satu jenis objek JSON.
Jenis JsonObject yang disediakan oleh sampel ini memperkenalkan representasi bertipe lemah dari objek JSON yang dideserialisasi.
JsonObject bergantung pada pemetaan alami antara objek JSON dan kamus .NET Framework, dan pemetaan antara array JSON dan array .NET Framework. Kode berikut menunjukkan jenis 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]
};
Perhatikan bahwa Anda dapat "menelusuri" objek dan array JSON tanpa perlu mendeklarasikan jenisnya pada waktu kompilasi. Untuk penjelasan tentang persyaratan untuk objek ["root"] tingkat atas, lihat topik Pemetaan Antara JSON dan XML.
Catatan
Kelas JsonObject disediakan sebagai contoh saja. Ini belum diuji secara menyeluruh, dan tidak boleh digunakan di lingkungan produksi. Implikasi yang jelas dari serialisasi JSON yang diketik dengan lemah adalah kurangnya keamanan ketikan saat bekerja dengan JsonObject.
Untuk menggunakan jenis JsonObject, kontrak operasi klien harus menggunakan Message sebagai jenis pengembaliannya.
[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 kemudian dibuat seperti yang ditunjukkan dalam kode berikut.
// 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 mengambil XmlDictionaryReader, yang diperoleh melalui metode GetReaderAtBodyContents. Pembaca berisi representasi XML dari pesan JSON yang diterima oleh klien. Untuk informasi selengkapnya, lihat topik Pemetaan Antara JSON dan XML.
Contoh ini menghasilkan output berikut:
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.
Untuk menyiapkan, membangun, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.
Bangun solusi WeaklyTypedJson.sln seperti yang dijelaskan dalam Membangun Sampel Windows Communication Foundation.
Jalankan solusi tersebut.