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.