JSON “[” ile başlayabilir mi?


178

Json.org'da okuyabildiğim kadarıyla , tüm JSON dizeleri {(kıvırcık küme ayracı) ile başlamalı ve [karakterler (köşeli ayraçlar) JSON'daki bir dizi öğesini temsil etmelidir .

json4jKütüphaneyi kullanıyorum ve ile başlayan bir girdi aldım [, bu yüzden bunun geçerli JSON olduğunu düşünmedim. JSON şemasına kısaca baktım, ancak gerçekten bir JSON dosyasının başlayamadığını [veya sadece başlayabileceğini belirttiğini bulamadım {.


(Görünüşe göre, en dıştaki JSON türünü bilmenizi gerektiren kötü tasarlanmış birkaç JSON kütüphanesi vardır. Buradaki en basit "düzeltme" JSON dizesini çevrelemek, []bir dizi olarak ayrıştırmak ve ilk dizi öğesini almaktır.)
Hot Licks

Görünüşe göre {ile başlaması daha güvenlidir [değil, geçerli bir Javascript dizisi değildir ve CSRF saldırıları için kullanılamaz.
David Klempfner

Yanıtlar:


218

JSON bir dizi veya nesne olabilir. Özellikle json.org dışında:

JSON iki yapı üzerine kurulmuştur:

  • Bir isim / değer çifti koleksiyonu. Çeşitli dillerde, bu bir nesne, kayıt, yapı, sözlük, karma tablosu, anahtarlı liste veya ilişkilendirilebilir dizi olarak gerçekleştirilir.
  • Sıralı değerler listesi. Çoğu dilde bu bir
    dizi, vektör, liste veya dizi olarak gerçekleştirilir.

Daha sonra iki yapıyı şu şekilde tarif eder: Bir JSON nesnesi Bir JSON dizisi

Başlangıç ​​ve bitiş karakterlerinin sırasıyla köşeli parantez ve köşeli parantez olduğunu unutmayın.

Düzenle
ve buradan: http://www.ietf.org/rfc/rfc4627.txt

JSON metni bir dizi dizgidir. Simge seti altı yapısal karakter, dize, sayı ve üç değişmez ad içerir.

JSON metni serileştirilmiş bir nesne veya dizidir.

Güncelleme (2014)

Mart 2014 itibariyle , tanımı biraz değiştiren yeni bir JSON RFC ( 7159 ) vardır (bkz. Sayfa 4/5).

RFC 4627'ye göre tanım: JSON-text = object / array

Bu RFC 7159'da şu şekilde değiştirildi: JSON-text = ws value ws

Burada wsboşluk temsil eder ve valueşu şekilde tanımlanır:

JSON değeri bir nesne, dizi, sayı veya dize veya aşağıdaki üç değişmez addan biri OLMALIDIR:

false null true

Yani, sorunun cevabı hala evet, JSON metni bir köşeli parantezle (yani bir dizi) başlayabilir. Ama nesneler ve diziler ek olarak, artık aynı zamanda bir sayı, dize veya değerler olabilir false, nullya da true.

Ayrıca, bu önceki RFC 4627 teklifimden değişti (vurgu eklendi):

JSON metni bir dizi dizgidir. Simge seti altı yapısal karakter, dize, sayı ve üç değişmez ad içerir.

JSON metni serileştirilmiş bir değerdir . Önceki JSON spesifikasyonlarının bir JSON metnini bir nesne veya dizi olarak sınırladığını unutmayın. Yalnızca bir JSON metninin çağrıldığı nesneleri veya dizileri oluşturan uygulamalar, tüm uygulamaların bunları uygun JSON metinleri olarak kabul etmesi açısından birlikte çalışabilir.


teşekkürler, bu şekle birçok kez bakıyorum, görünüşe göre json4j kütüphanesi ile ilgili bir sorun var, ki bu bir json'u sevmiyor [.
Tiberiu

1
@Tiberiu Hajas: İlk bulduğumda anlamam biraz zaman aldı. Ancak bazı JSON örneklerini gördükten ve karşılaştırdıktan sonra, bunu nasıl yaptıklarını gerçekten çok seviyorum. Json4j ile ilgili olarak, belki de json4j kütüphanesinin yaratıcısına bir hata raporu gönderebilirsiniz .
Richard Marskell - Drackir

Muhtemelen partiye geç kaldım. Ancak RFC 8259'da bulduğum şey, bir JSON metninin, Unicode kod noktalarından oluşturulan ve JSON değeri dilbilgisine uyan belirteç dizisi olduğunu söylüyor. Belirteç kümesi altı yapısal belirteç, dize, sayı ve üç değişmez ad belirteci içerir. Bu, şöyle bir şey gibi görünüyor: {"1234"}, {true}. Ancak bu neyi temsil ediyor? Bu bir dizi değildir, çünkü <code> [] </code> yoktur, ikisi de yoktur, çünkü ikisi de yoktur.
Nicholas Humphrey

1
@NicholasHumphrey Yukarıda yazdıklarım hala 8259'da geçerlidir. Aynı bölümde 2 (JSON Grammar) JSON metni (JSON belgesi olarak da bilinir) şöyle tanımlanır: JSON-text = ws value wsburada "JSON değeri bir nesne, dizi, sayı veya dize OLMALIDIR, veya şu üç değişmez addan birini kullanabilirsiniz: Bölüm 3 (Değerler) başına false, null, true ". Örneğiniz bu kısıtlamaları karşılamıyor ve geçerli JSON değil.
Richard Marskell - Drackir

8

Eğer ayrıştırma dize sol payanda ile başlıyorsa ([) kullanabilirsiniz JSONArray.parsebir JSONArray nesneyi geri almak için ve daha sonra da kullanabilirsiniz get(i)nereye i iade JSONArray en 0'dan bir endeksidir size()-1.

import java.io.IOException;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;

public class BookListTest {
   public static void main(String[] args) {
      String jsonBookList = "{\"book_list\":{\"book\":[{\"title\":\"title 1\"},{\"title\":\"title 2\"}]}}";
      Object book_list;
      try {
         book_list = JSONObject.parse(jsonBookList);
         System.out.println(book_list);
         Object bookList = JSONObject.parse(book_list.toString()).get("book_list");
         System.out.println(bookList);
         Object books = JSONObject.parse(bookList.toString()).get("book");
         System.out.println(books);
         JSONArray bookArray = JSONArray.parse(books.toString());
         for (Object book : bookArray) {
            System.out.println(book);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Hangi gibi çıktı üretti:

{"book_list":{"book":[{"title":"title 1"},{"title":"title 2"}]}}
{"book":[{"title":"title 1"},{"title":"title 2"}]}
[{"title":"title 1"}, {"title":"title 2"}]
{"title":"title 1"}
{"title":"title 2"}

Not: Telefon etmeyi denerseniz JSONObject.parse(books.toString());karşılaştığınız hatayı alırsınız:

java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['

1
Daha basit bir kod, nesneyi ayrıştırmak için hangi sınıfın kullanılması gerektiğini belirlemek için get çağrısından döndürülen nesne üzerindeki JSONArray örneğine karşı JSONArray örneğini kullanabilir ...
Nathaniel Mills

5

JSON.ORG SİTESİ diyor ...

https://www.json.org/

Site aşağıdakileri açıkça belirtmektedir:

JSON iki yapı üzerine kurulmuştur:

  1. Bir isim / değer çifti koleksiyonu. Çeşitli dillerde, bu bir nesne, kayıt, yapı, sözlük, karma tablosu, anahtarlı liste veya ilişkilendirilebilir dizi olarak gerçekleştirilir.

  2. Sıralı değerler listesi. Çoğu dilde bu bir dizi, vektör, liste veya dizi olarak gerçekleştirilir.

Bunlar evrensel veri yapılarıdır. Hemen hemen tüm modern programlama dilleri bunları şu ya da bu şekilde destekler. Programlama dilleri ile değiştirilebilir bir veri formatının da bu yapılara dayandırılması mantıklıdır. JSON'da şu formları alırlar:

NESNE:

Bir nesne, sıralanmamış bir ad / değer çifti kümesidir. Bir nesne {(sol küme ayracı) ile başlar ve} (sağ küme ayracı) ile biter. Her adın ardından gelir: (iki nokta üst üste) ve ad / değer çiftleri, (virgül) ile ayrılır.

{string: value, string: value}

DİZİ:

Dizi, düzenli bir değerler koleksiyonudur. Dizi [(sol köşeli ayraç) ile başlar ve] (sağ köşeli ayraç) ile biter. Değerler, (virgül) ile ayrılır.

[value, value, value ….]

DEĞER:

Değer, çift tırnak içindeki bir dize ya da bir sayı ya da doğru ya da yanlış ya da null ya da bir nesne ya da dizi olabilir. Bu yapılar yuvalanabilir.

STRING:

Bir dize, ters eğik çizgi kaçışlarını kullanarak çift tırnak içine alınmış sıfır veya daha fazla Unicode karakter dizisidir. Bir karakter, tek bir karakter dizesi olarak temsil edilir. Bir dize, C veya Java dizesine çok benzer.

NUMARA:

Sekizlik ve onaltılık biçimlerin kullanılmaması dışında, sayı C veya Java numarasına çok benzer.

WHITESPACE HAKKINDA:

Herhangi bir jeton arasına boşluk eklenebilir. Dili tamamen açıklayan birkaç kodlama detayı hariç.


Örneklerle iyi; JSON doğrulayıcı için birim testimi yazmamı sağladı. Ne dize ile kastedildi emin değildi (örneğin. Çift tırnak içinde bir dize olmalıdır).
gimlichael

Bunun nasıl karıştırılabileceğini görüyorum, cümle aşağıdaki gibi başlayarak biraz daha özlü olabilirdi: "Sıfır veya daha fazla Unicode karakter dizisi ..." Yazarın vurgulamak için eklemiş olabileceğine inanıyorum. Bazı önemli noktaları görmeyi kolaylaştıracak şekilde ortaya koydum. Geç bir yanıt olmasına rağmen, umarım gerekirse biraz netlik katar.
J. Moreno
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.