Bir dizi üst düzey JSON metni olabilir mi?


Yanıtlar:


126

Evet, bir dizi üst düzey JSON metni olarak yasaldır.

JSON'u tanımlayan üç standart belge vardır: RFC 4627 , RFC 7159 (RFC 4627'yi geçersiz kılar) ve ECMA-404 . Hangi üst düzey öğelere izin verdiklerinde farklılık gösterirler, ancak tümü bir nesneye veya diziye en üst düzey öğe olarak izin verir.

  • RFC 4627: Nesne veya dizi.
    "JSON metni, serileştirilmiş bir nesne veya dizidir."
  • RFC 7159: Herhangi bir JSON değeri.
    "JSON metni serileştirilmiş bir değerdir."
  • ECMA-404: Herhangi bir JSON değeri.
    "Bir JSON metni, JSON değeri gramerine uyan Unicode kod noktalarından oluşan bir dizi jetondur."

2
İtibarıyla bu yeni RFC , "Bir JSON metin simgelerin bir dizisidir. Jeton grubu altı yapısal karakterleri, ipler, sayı ve üç değişmez isim içerir."
— antak

64

Evet , ancak JSON kaçırma nedeniyle bazı senaryolarda kökü bunun yerine bir nesne yapmayı düşünmelisiniz . Bu, JavaScript'te dizi yapıcısının geçersiz kılınmasına dayanan bir bilginin açığa çıkması güvenlik açığıdır.


11
Evet, bu harika bir cevabın alamet-i farikasıdır - sadece OP'ye bilmek istediklerini değil, aynı zamanda bilmeleri gerekenleri (ama fark etmediklerini) söylemek. Aslında, JSON ile ilişkili, Javascript olarak ayrıştırılan bir dizi güvenlik açığı vardır, JSON kaçırma yalnızca bir örnektir.
— sleske


4

Bu, ECMAScript spesifikasyonundandır.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
Yine de bu biraz yanıltıcıdır, çünkü ECMAScript üst düzey metinler olmayan JSON dizelerini ayrıştırmanıza izin verir. RFC'ye göre, "JSON metni serileştirilmiş bir nesne veya dizidir."
— Matthew Flaschen

@Matthew - Tuhaf, Crockford'un bu konuda nasıl hissettiğini merak ediyorum. RFC ve ECMA arasındaki farkları nasıl uzlaştıracaklar?
— ChaosPandion

3
Sadece baktım ve farkın farkında olduklarını gördüm. ECMAScript 5 §15.12'den, "ECMAScript JSON dilbilgisinin üst düzey JSONText üretimi, RFC 4627 tarafından belirtildiği gibi bir JSONObject veya JSONArray olmakla sınırlanmak yerine herhangi bir JSONValue'dan oluşabilir." IETF'in RFC'yi değiştirip değiştirmeyeceğini bilmiyorum.
— Matthew Flaschen

@Matthew - Bunun için teşekkürler, korkunç bir şekilde kafam karıştı. Json.org açıklaması daha kısıtlayıcı "json-metin" kavramını söz etmez hiç ve önemi hakkında belirsiz bir RFC tür.
— mrec

Bu cevap ECMAScript ile ilgili, ancak soru JSON ile ilgili. (Kasıtlı olarak) benzer görünseler de, farklı özelliklerdir .
— sleske


1

Diğer yorumlarda görülen bazı karışıklıklar var. "Application / json" ortam türü, JSON RFC başına, JSON metni için yalnızca en üst düzeyde nesne veya diziye izin verir . Ancak, bir ayrıştırıcı için, ECMAScript belirtiminde görüldüğü gibi herhangi bir JSON değeri kabul edilebilir.


En üst düzey öğe olarak herhangi bir JSON değeri, bir ECMAScript ayrıştırıcısı için kabul edilebilir , ancak (uyumlu) bir JSON ayrıştırıcısı için geçerli değildir - önemli ayrım.
— sleske

Bu ilginç bir ayrım ama ne dediğini anlamıyorum. "(Uyumlu) JSON ayrıştırıcısının" tanımı nedir?
— cdunn2001

1
Bir JSON ayrıştırıcısı, JSON dilbilgisi için bir ayrıştırıcıdır. JSON, Javascript'e benzemekle birlikte, farklı (çok daha basit) bir gramerdir. JSON dilbilgisini açıklayan tools.ietf.org/html/rfc7159'a bakın . "uyumlu" sadece ayrıştırıcının aslında grameri (herhangi bir düzgün ayrıştırıcının yapması gereken) izlediği anlamına gelir.
— sleske

3
RFC 4627 güncel değil, lütfen artık ona uymayın. Yeni RFC, üst düzeyde basit değerlere de izin verir.
— Matthias Dieter Wallnöfer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.