Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
JsonReaderWriterFactory tarafından üretilen okuyucular ve yazarlar, JavaScript Nesne Gösterimi (JSON) içeriğini kullanarak bir XML API'si sağlar. JSON, JavaScript'in nesne değişmez değerlerinin bir alt kümesini kullanarak verileri kodlar. Bu fabrika tarafından üretilen okuyucular ve yazarlar, WebMessageEncodingBindingElement veya WebHttpBinding kullanılarak Windows Communication Foundation (WCF) uygulamaları tarafından JSON içeriği gönderilirken veya alınırken de kullanılır.
JSON içeriğiyle başlatıldığında JSON okuyucu, metin xml okuyucusunun XML örneği üzerinde yaptığı gibi davranır. JSON yazıcısı, metinsel XML okuyucusunun belirli bir XML örneğini üreten çağrılar dizisi verildiğinde JSON içeriğini yazar. Bu XML örneği ile JSON içeriği arasındaki eşleme, bu konuda gelişmiş senaryolarda kullanılmak üzere açıklanmıştır.
JSON, WCF tarafından işlendiğinde dahili olarak xml bilgi kümesi olarak temsil edilir. Normalde eşleme yalnızca mantıksal bir gösterim olduğundan bu iç gösterimle ilgilenmeniz gerekmez: JSON normalde fiziksel olarak bellekte XML'ye veya XML'den JSON'a dönüştürülmemektedir. Eşleme, XML API'lerinin JSON içeriğine erişmek için kullanıldığı anlamına gelir.
WCF, JSON kullandığında, genellikle DataContractJsonSerializer veya uygun olduğunda WebScriptEnablingBehavior davranışı tarafından otomatik olarak takılırWebHttpBehavior. , DataContractJsonSerializer JSON ile XML bilgi kümesi arasındaki eşlemeyi anlar ve doğrudan JSON ile ilgileniyor gibi davranır. (XML'nin aşağıdaki eşlemeye uygun olduğunu anlayarak herhangi bir XML okuyucusu veya yazıcısıyla kullanmak DataContractJsonSerializer mümkündür.)
Gelişmiş senaryolarda, aşağıdaki eşlemeye doğrudan erişmek gerekebilir. Bu senaryolar, JSON'ı DataContractJsonSerializer'a bağlı kalmadan özel yollarla seri hale getirmek ve seri durumdan çıkarmak istediğinizde veya JSON içeren iletiler için doğrudan Message türüyle ilgilendiğinizde ortaya çıkar. JSON-XML eşlemesi, ileti günlüğü için de kullanılır. WCF'de ileti günlüğü özelliği kullanılırken, JSON iletileri sonraki bölümde açıklanan eşlemeye göre XML olarak günlüğe kaydedilir.
Eşleme kavramını netleştirmek için aşağıdaki örnek bir JSON belgesidir.
{"product":"pencil","price":12}
Daha önce bahsedilen okuyuculardan birini kullanarak bu JSON belgesini okumak için aşağıdaki XML belgesini okumak için kullandığınız çağrı dizisini XmlDictionaryReader kullanın.
<root type="object">
<product type="string">pencil</product>
<price type="number">12</price>
</root>
Ayrıca, örnekteki JSON iletisi WCF tarafından alınır ve günlüğe kaydedilirse, önceki günlükte XML parçasını görürsünüz.
JSON ile XML Infoset Arasında Eşleme
Resmi olarak, eşleme RFC 4627'de açıklandığı gibi JSON (gevşetilen ve eklenen bazı diğer kısıtlamalar hariç) ile XML Bilgi Kümesi'nde açıklandığı gibi XML bilgi kümesi (metin XML'i değil) arasındadır. [köşeli ayraçlar] içindeki bilgi öğelerinin ve alanların tanımları için bu konuya bakın.
Boş bir JSON belgesi, bir boş XML belgesine eşlenir; aynı şekilde boş bir XML belgesi de, bir boş JSON belgesine eşlenir. XML ve JSON arasında yapılan eşleme işleminde, belge öncesi boşluklar ve belge sonrası boşluklara izin verilmez.
Eşleme, Belge Bilgi Öğesi (DII) veya Öğe Bilgi Öğesi (EII) ile JSON arasında tanımlanır. EII veya DII'nin [document element] özelliği, Kök JSON Öğesi olarak adlandırılır. Belge parçalarının (birden çok kök öğe içeren XML) bu eşlemede desteklenmediğini unutmayın.
Örnek: Aşağıdaki belge:
<?xml version="1.0"?>
<root type="number">42</root>
Ve aşağıdaki öğe:
<root type="number">42</root>
Her ikisinde de JSON eşlemesi vardır.
<root> öğesi, her iki durumda da Kök JSON Öğesidir.
Ayrıca DII söz konusu olduğunda aşağıdakiler dikkate alınmalıdır:
[children] listesindeki bazı öğeler mevcut olmamalıdır. JSON'dan eşlenen XML'i okurken bu olguya güvenmeyin.
[alt öğe] listesinde açıklama bilgileri öğesi yoktur.
[children] listesinde DTD bilgi öğesi yoktur.
[children] listesinde kişisel Bilgi (PI) bilgi öğeleri yoktur (
<?xml…>bildirim PI bilgi öğesi olarak kabul edilmez)[notations] kümesi boş.
[ayrıştırılmamış varlıklar] kümesi boş.
Örnek: Aşağıdaki belgede JSON eşlemesi yok çünkü [children] bir PI ve bir açıklama barındırıyor.
<?xml version="1.0"?>
<!--comment--><?pi?>
<root type="number">42</root>
Kök JSON Öğesinin EII değeri aşağıdaki özelliklere sahiptir:
[yerel ad], "root" değerine sahiptir.
[ad alanı adı] değeri yok.
[prefix] değerinin değeri yok.
[children] EI'leri (daha ayrıntılı açıklandığı gibi İç Öğeleri temsil eden) veya URI'leri (daha sonra açıklandığı gibi Karakter Bilgi Öğeleri) içerebilir veya bunların hiçbirini içermeyebilir, ancak ikisini birden içeremez.
[öznitelikler] aşağıdaki isteğe bağlı öznitelik bilgileri öğelerini (AII) içerebilir
Daha fazla açıklandığı gibi JSON Tür Özniteliği ("tür"). Bu öznitelik eşlenen XML'deki JSON türünü (dize, sayı, boole, nesne, dizi veya null) korumak için kullanılır.
Daha fazla açıklandığı gibi Veri Sözleşmesi Adı Özniteliği ("__type"). Bu öznitelik yalnızca JSON türü özniteliği de mevcutsa ve [normalleştirilmiş değeri] "object" olduğunda kullanılabilir. Bu öznitelik, veri sözleşmesi türü bilgilerini korumak için kullanılır
DataContractJsonSerializer; örneğin, türetilmiş bir türün seri hale getirildiği ve temel türün beklendiği polimorfik durumlarda.DataContractJsonSerializerile çalışmıyorsanız, çoğu durumda bu öznitelik yoksayılır.[Kapsam içi ad alanları], infoset belirtimi tarafından zorunlu kılındığı şekilde "xml"
http://www.w3.org/XML/1998/namespacebağlantısını içerir.[children], [attributes] ve [in-scope namespaces] öğeleri, daha önce belirtilenler dışında hiçbir öğret içermemelidir ve [ad alanı öznitelikleri] hiçbir üyeye sahip olmamalıdır, ancak JSON'dan eşlenen XML'i okurken bu olgulara güvenmemelisiniz.
Örnek: [ad alanı öznitelikleri] boş olmadığından aşağıdaki belgede JSON eşlemesi yok.
<?xml version="1.0"?>
<root xmlns:a="myattributevalue">42</root>
JSON Tür Özniteliği için AII aşağıdaki özelliklere sahiptir:
- [ad alanı adı] değeri yok.
- [prefix] değerinin değeri yok.
- [yerel ad], "type" şeklindedir.
- [normalleştirilmiş değer], aşağıdaki bölümde açıklanan olası tür değerlerinden biridir.
- [belirtilen]
true'dır. - [öznitelik türü] değeri yok.
- [references] değeri yok.
Veri Sözleşmesi Adı Özniteliği için AII aşağıdaki özelliklere sahiptir:
- [ad alanı adı] değeri yok.
- [prefix] değerinin değeri yok.
- [yerel ad], "__tip" (iki alt çizgi ve sonra "tip") şeklindedir.
- [normalleştirilmiş değer], geçerli bir Unicode dizesidir; bu dizenin JSON ile eşleştirilmesi aşağıdaki bölümde açıklanmıştır.
- [belirtilen] değeridir
true. - [öznitelik türü] değeri yok.
- [references] değeri yok.
Kök JSON Öğesi veya diğer iç öğeler içinde yer alan iç öğeler aşağıdaki özelliklere sahiptir:
- [yerel ad], daha sonra açıklandığı gibi herhangi bir değere sahip olabilir.
- [ad alanı adı], [ön ek], [alt öğe], [öznitelikler], [ad alanı öznitelikleri] ve [kapsam içi ad alanları] Kök JSON Öğesi ile aynı kurallara tabidir.
Hem Kök JSON Öğesinde hem de iç öğelerde, JSON Tür Özniteliği JSON ile eşlemeyi ve olası [alt öğeleri] ve bunların yorumunu tanımlar. Özniteliğin [normalleştirilmiş değeri] harf duyarlıdır, küçük harfle olmalı ve boşluk içermemelidir.
| JSON Tür Özniteliğinin AII değerinin [normalleştirilmiş değeri] | İlgili EII'nin izin verilen [alt öğeleri] | JSON'a Eşleme |
|---|---|---|
string (veya JSON türü AII'nin olmaması)A string ve JSON türü AII'nin olmaması string'i varsayılan yapar.Bu nedenle, <root> string1</root> JSON string "string1" ile eşleşir. |
0 veya daha fazla CII | JSON string (JSON RFC, bölüm 2.5). Her char biri, CII'den [karakter kodu] öğesine karşılık gelen bir karakterdir. CI'ler yoksa, boş bir JSONstring ile eşlenir.Örnek: Aşağıdaki öğe bir JSON parçasına eşleşir. <root type="string">42</root>JSON parçası "42"dir. XML'de JSON eşlemesinde, kaçış karakteri olması gereken karakterler kaçış karakterleriyle eşlenir, diğer tüm karakterler kaçış yapılmayan karakterlerle eşlenir. "/" karakteri özeldir; olması gerekmese bile ("\/" olarak yazılır) kaçış karakteridir. Örnek: Aşağıdaki öğe bir JSON parçasına eşleştirilir. <root type="string">the "da/ta"</root>JSON parçası "\"da\/ta\"" şeklindedir. JSON'dan XML'e eşlemede, kaçış karakterlerine sahip karakterler ve kaçış karakteri olmayan karakterler doğru şekilde ilgili [karakter kodu] ile eşlenir. Örnek: "\u0041BC" JSON parçası aşağıdaki XML öğesine eşler. <root type="string">ABC</root>Dize, XML ile eşlenmeyen boşluklarla (JSON RFC'nin 2. bölümündeki 'ws') çevrelenebilir. Örnek: JSON parçası "ABC", (ilk çift tırnak işaretinden önce boşluklar var), aşağıdaki XML öğesiyle eşlenir. <root type="string">ABC</root>XML'deki herhangi bir boşluk JSON'daki boşluğa haritalanır. Örnek: Aşağıdaki XML öğesi bir JSON parçasıyla eşleştirir. <root type="string"> A BC </root>JSON parçası " A BC ". |
number |
1 veya daha fazla URI | Bir JSON number (JSON RFC, bölüm 2.4), muhtemelen boşlukla çevrelenmiştir. Sayı/boşluk bileşimindeki her karakter, CII'deki [karakter koduna] karşılık gelen bir karakterdir.Örnek: Aşağıdaki öğe bir JSON parçasıyla eşleştirir. <root type="number"> 42</root>JSON parçası 42 (Boşluk korunur). |
boolean |
4 veya 5 CII (bu, true veya false ile eşleşir), muhtemelen ek boşluklu CII'ler ile çevrilidir. |
"true" dizesine karşılık gelen bir CII dizisi değişmez değerine trueeşlenir ve "false" dizesine karşılık gelen bir CII dizisi değişmez değerine falseeşlenir. Çevreleyen boşluk korunur.Örnek: Aşağıdaki öğe bir JSON bölümüyle eşleştirilir. <root type="boolean"> false</root>JSON parçası şeklindedir false. |
null |
İzin verilmiyor. | Değişmez değeri null. JSON to XML eşlemesinde null , XML ile eşlenmeyen boşluklarla (bölüm 2'deki 'ws') çevrelenmiş olabilir.Örnek: Aşağıdaki öğe bir JSON parçasıyla eşleştirilir. <root type="null"/>veya <root type="null"></root>: Her iki durumda da JSON bölümü Null şeklindedir. |
object |
0 veya daha fazla EII. |
begin-object (sol süslü parantez) JSON RFC'nin 2.2. bölümünde olduğu gibi, ardından daha sonra açıklanan şekilde her EII için bir üye kaydı. Birden fazla EII varsa, üye kayıtları arasında değer ayırıcıları (virgüller) vardır. Tüm bunları bir uç nesne (sağ küme ayracı) izler.Örnek: Aşağıdaki öğe JSON parçasına eşlenir. <root type="object"><type1 type="string">aaa\</type1><type2 type="string">bbb\</type2></root >JSON parçası şeklindedir {"type1":"aaa","type2":"bbb"}.XML'de JSON eşlemesinde Veri Sözleşmesi Türü Özniteliği varsa, en başa ek bir Üye Kaydı eklenir. Adı, Veri Sözleşmesi Türü Özniteliğinin [yerel adı] ("__type") ve değeri özniteliğin [normalleştirilmiş değeri] şeklindedir. Buna karşılık, JSON ile XML eşlemesinde, ilk üye kaydının adı Veri Sözleşmesi Türü Özniteliğinin [yerel adı] ise ("__type"), eşlenen XML'de karşılık gelen bir Veri Sözleşmesi Türü Özniteliği bulunur, ancak buna karşılık gelen bir EII yoktur. Bu özel eşlemenin uygulanabilmesi için önce JSON nesnesinde bu üye kaydının gerçekleşmesi gerektiğini unutmayın. Bu, üye kayıtlarının sırasının önemli olmadığı normal JSON işlemeden ayrılmayı temsil eder. Örnek: Aşağıdaki JSON parçası XML'e eşlenir. {"__type":"Person","name":"John"}XML aşağıdaki koddur. <root type="object" __type="Person"> <name type="string">John</name> </root>__type AII'nin mevcut olduğuna, ancak __type EII olmadığına dikkat edin. Ancak, JSON'daki sıra aşağıdaki örnekte gösterildiği gibi tersine çevrilir. {"name":"John","\_\_type":"Person"}Karşılık gelen XML gösterilir. <root type="object"> <name type="string">John</name> <__type type="string">Person</__type> </root>Başka bir deyişle, __type özel anlamını kaybeder ve her zamanki gibi bir EII'ye eşlenir, AII'ye değil. Bir JSON değerine eşlendiğinde AII'nin [normalleştirilmiş değeri] için kaçış/özetleme kuralları, bu tablonun "dize" satırında belirtilen JSON dizeleriyle aynıdır. Örnek: <root type="object" __type="\abc" />Önceki örneğe aşağıdaki JSON ile eşlenebilir. {"__type":"\\abc"}JSON'a XML eşlemesinde ilk EII'nin [yerel adı] "__type" olmamalıdır. Boşluk karakteri ( ws), nesneler için XML'den JSON'a eşlemede hiçbir zaman oluşturulmaz ve JSON'dan XML'e eşlemelerde yoksayılır.Örnek: Aşağıdaki JSON parçası bir XML öğesiyle eşleşir. { "ccc" : "aaa", "ddd" :"bbb"}XML öğesi aşağıdaki kodda gösterilir. <root type="object"> <ccc type="string">aaa</ccc> <ddd type="string">bbb</bar> </root > |
| dizi | 0 veya daha fazla EII | JSON RFC'nin 2.3. bölümünde olduğu gibi bir başlangıç dizisi (sol köşeli ayraç) ve ardından daha sonra açıklandığı gibi her EII için bir dizi kaydı. Birden fazla EII varsa, dizi kayıtları arasında değer ayırıcıları (virgüller) vardır. Tüm bunları bir sonlandırma dizisi izler. Örnek: Aşağıdaki XML öğesi bir JSON parçasıyla eşleşir. <root type="array"/> <item type="string">aaa</item> <item type="string">bbb</item> </root >JSON parçası ["aaa","bbb"]Boşluk ( ws), diziler için XML'den JSON'a eşlemede hiçbir zaman oluşturulmaz ve JSON'dan XML'e eşlemede dikkate alınmaz.Örnek: JSON parçası. ["aaa", "bbb"]Eşlem yaptığı XML öğesi. <root type="array"/> <item type="string">aaa</item> <item type="string">bbb</item> </root > |
Üye Kayıtları aşağıdaki gibi çalışır:
- İç öğenin [yerel adı], JSON RFC'nin 2.2. bölümünde tanımlandığı
memberkısmınastringeşler.
Örnek: Aşağıdaki öğe bir JSON parçasıyla eşleştirilir.
<root type="object">
<myLocalName type="string">aaa</myLocalName>
</root>
Aşağıdaki JSON parçası görüntülenir.
{"myLocalName":"aaa"}
JSON'a XML eşlemesinde, JSON'da kaçılması gereken karakterler kaçılır ve diğerleri kaçılmaz. "/" karakteri, kaçış yapılması gereken bir karakter olmasa da yine de kaçışa tabi tutulur (JSON'dan XML'e eşleme sırasında kaçış gerekmez). JSON'daki veriler için ASP.NET AJAX biçimini desteklemek için
DateTimebu gereklidir.JSON to XML eşlemesinde, gerekirse kaçış yapılmamış karakterler dahil tüm karakterler alınarak bir
stringoluşturulur ve bu da bir [yerel ad] üretir.İç öğeler [children],
Root JSON Elementiçin olduğu gibiJSON Type Attribute'e göre bölüm 2.2'deki değerle eşlenir. EI'lerin birden çok iç içe yerleştirme düzeyine (diziler içinde iç içe yerleştirme dahil) izin verilir.
Örnek: Aşağıdaki öğe bir JSON parçasına eşlenir.
<root type="object">
<myLocalName1 type="string">myValue1</myLocalName1>
<myLocalName2 type="number">2</myLocalName2>
<myLocalName3 type="object">
<myNestedName1 type="boolean">true</myNestedName1>
<myNestedName2 type="null"/>
</myLocalName3>
</root >
Aşağıdaki JSON parçası ile eşleniyor.
{"myLocalName1":"myValue1","myLocalName2":2,"myLocalName3":{"myNestedName1":true,"myNestedName2":null}}
Not
Önceki eşlemede XML kodlama adımı yok. Bu nedenle, WCF yalnızca anahtar adlarındaki tüm karakterlerin XML öğesi adlarındaki geçerli karakterler olduğu JSON belgelerini destekler. Örneğin, XML öğesi için geçerli bir ad olmadığından JSON belgesi {"<":"a"} desteklenmez < .
Önceki eşlemede JSON kaçış/unescaping adımları bulunduğundan ters durum (XML'de geçerli olan ancak JSON'da olmayan karakterler) herhangi bir soruna neden olmaz.
Dizi Kayıtları aşağıdaki gibi çalışır:
İç öğenin [yerel adı] "öğe"dir.
İç öğenin [children] öğesi, Kök JSON Öğesi için olduğu gibi JSON Tür Özniteliğine göre bölüm 2.3'teki değerle eşleniyor. EI'lerin birden çok iç içe yerleştirme düzeyine (nesnelerin içinde iç içe yerleştirme dahil) izin verilir.
Örnek: Aşağıdaki öğe bir JSON parçasıyla eşleşir.
<root type="array">
<item type="string">myValue1</item>
<item type="number">2</item>
<item type="array">
<item type="boolean">true</item>
<item type="null"/></item>
</root>
Aşağıda JSON parçası yer alır.
["myValue1",2,[true,null]]