JSON ve XML Arasında Eşleme
tarafından JsonReaderWriterFactory oluşturulan okuyucular ve yazarlar, JavaScript Nesne Gösterimi (JSON) içeriği üzerinden bir XML API'sini 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, veya kullanılarak WebMessageEncodingBindingElement Windows Communication Foundation (WCF) uygulamaları tarafından JSON içeriği gönderilirken veya WebHttpBindingalı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ı, metin xml okuyucusunun belirli bir XML örneğini ürettiği çağrı 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, her zamanki senaryo davranış tarafından WebScriptEnablingBehavior veya uygun olduğunda davranış tarafından WebHttpBehavior otomatik olarak takılı olmasıdırDataContractJsonSerializer. , 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'ı özel yollarla, 'a bağlı kalmadan seri hale getirmek ve seri durumdan DataContractJsonSerializerçıkarmak istediğinizde veya doğrudan JSON içeren iletiler için türle Message ilgilenirken 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 boş bir XML belgesine, boş bir XML belgesi ise boş bir JSON belgesine eşler. XML'de JSON eşlemesinde, belgeden önce boşluk ve sondaki 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. ileDataContractJsonSerializer
ç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/namespace
bağlamasını içerir.[children], [attributes] ve [in-scope namespaces] öğelerinin daha önce belirtilenler dışında hiçbir öğesi olmamalıdır ve [ad alanı öznitelikleri] üyesi olmamalıdır, ancak JSON'dan eşlenen XML okunurken bu olgulara güvenmemelidir.
Ö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] değeridir
true
. - [ö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] "__type" (iki alt çizgi ve ardından "tür") ş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] büyük/küçük harfe duyarlıdır ve küçük harf olmalıdır ve boşluk içeremez.
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 yokluğu)A string ve JSON türü AII'nin olmaması aynı varsayılanı yapar string .Bu nedenle, <root> string1</root> JSON string "string1" ile eşler. |
0 veya daha fazla URI | JSON string (JSON RFC, bölüm 2.5). Her char biri, CII'den [karakter kodu] öğesine karşılık gelen bir karakterdir. URI yoksa boş bir JSON string ile eşlenir.Örnek: Aşağıdaki öğe bir JSON parçasıyla eşler: <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ıyla eşler. <root type="string">the "da/ta"</root> JSON parçası "\"da\/ta\"" şeklindedir. JSON-XML eşlemesinde, kaçış karakteri olmayan tüm karakterler ve karakterler ilgili [karakter kodu] ile doğru 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şlukla eşler. Örnek: Aşağıdaki XML öğesi bir JSON parçasıyla eşler. <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şler. <root type="number"> 42</root> JSON parçası 42 (Boşluk korunur). |
boolean |
4 veya 5 URI (veya false 'ye true karşılık gelir), büyük olasılıkla ek boşluk URI'leri ile çevrelenmiştir. |
"true" dizesine karşılık gelen bir CII dizisi değişmez değerine true eşlenir ve "false" dizesine karşılık gelen bir CII dizisi değişmez değerine false eşlenir. Çevreleyen boşluk korunur.Örnek: Aşağıdaki öğe bir JSON parçasıyla eşler. <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şler. <root type="null"/> veya <root type="null"></root> : Her iki durumda da JSON parçası olur Null . |
object |
0 veya daha fazla EI. | begin-object JSON RFC'nin 2.2. bölümünde olduğu gibi bir (sol küme ayracı) ve ardından daha sonra açıklandığı gibi 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ıyla eşler. <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 ile eşler. {"__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 bir anlamı yoktur ve her zamanki gibi bir EII'ye eşler, tümüne 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" /> 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 ( ws ), nesneler için XML'den JSON eşlemesine hiçbir zaman oluşturulmaz ve JSON'da XML eşlemesinde yoksayılır.Örnek: Aşağıdaki JSON parçası bir XML öğesiyle eşler. { "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 bitiş dizisi izler. Örnek: Aşağıdaki XML öğesi bir JSON parçasıyla eşler. <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 ile JSON eşlemesi üzerinde hiçbir zaman oluşturulmaz ve JSON'da XML eşlemesinde yoksayılır.Ö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ımlanan bölümüyle
member
eşlerstring
.
Örnek: Aşağıdaki öğe bir JSON parçasıyla eşler.
<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çılması gereken bir karakter olmasa da yine de kaçıştır (JSON'da XML eşlemesine kaçış yapılması gerekmez). JSON'daki veriler için ASP.NET AJAX biçimini desteklemek için
DateTime
bu gereklidir.JSON to XML eşlemesinde, [yerel ad] üreten bir
string
oluşturmak için tüm karakterler (gerekirse kaçış karakteri olmayan karakterler dahil) alınır.[children] iç öğeleri, için olduğu gibi bölüm 2.2'deki değerle
JSON Type Attribute
eşlerRoot JSON Element
. 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ıyla eşler.
<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şler.
<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]]