Bisakah JSON memulai dengan “[”?

178

Dari apa yang dapat saya baca di json.org , semua string JSON harus dimulai dengan {(curly brace), dan [karakter (kurung siku) mewakili elemen array di JSON.

Saya menggunakan json4jperpustakaan, dan saya mendapat input yang dimulai dengan [, jadi saya tidak berpikir ini JSON yang valid. Saya melihat sekilas skema JSON, tetapi saya benar-benar tidak dapat menemukannya menyatakan bahwa file JSON tidak dapat memulai [, atau hanya dapat mulai dengan {.

Tiberiu
sumber
(Tampaknya ada beberapa perpustakaan JSON yang dirancang dengan buruk yang mengharuskan Anda untuk mengetahui tipe JSON terluar. "Perbaikan" paling sederhana di sini adalah mengelilingi string JSON dengan [], parsing sebagai array, dan ambil elemen array pertama.)
Hot Licks
Tampaknya lebih aman untuk memulainya dengan {dan bukan [sehingga itu bukan array Javascript yang valid, dan tidak dapat digunakan untuk serangan CSRF.
David Klempfner

Jawaban:


218

JSON bisa berupa array atau objek. Khusus off dari json.org:

JSON dibangun di atas dua struktur:

  • Kumpulan pasangan nama / nilai. Dalam berbagai bahasa, ini diwujudkan sebagai objek, catatan, struct, kamus, tabel hash, daftar kunci, atau array asosiatif.
  • Daftar nilai yang diurutkan. Dalam sebagian besar bahasa, ini diwujudkan sebagai
    array, vektor, daftar, atau urutan.

Selanjutnya dijelaskan dua struktur sebagai: Objek JSON Array JSON

Perhatikan bahwa karakter awal dan akhir masing-masing adalah kurung keriting dan kurung siku.

Edit
Dan dari sini: http://www.ietf.org/rfc/rfc4627.txt

Teks JSON adalah urutan token. Set token mencakup enam karakter struktural, string, angka, dan tiga nama literal.

Teks JSON adalah objek atau larik berseri.

Pembaruan (2014)

Pada Maret 2014, ada JSON RFC baru ( 7159 ) yang sedikit mengubah definisi (lihat halaman 4/5).

Definisi per RFC 4627 adalah: JSON-text = object / array

Ini telah diubah dalam RFC 7159 menjadi: JSON-text = ws value ws

Dimana wsmewakili spasi putih dan valuedidefinisikan sebagai berikut:

Nilai JSON HARUS berupa objek, array, angka, atau string, atau salah satu dari tiga nama literal berikut:

false null true

Jadi, jawaban untuk pertanyaannya masih ya, teks JSON dapat mulai dengan braket persegi (yaitu array). Tetapi selain objek dan array, sekarang juga bisa berupa angka, string atau nilai false, nullatau true.

Juga, ini telah berubah dari kutipan RFC 4627 saya sebelumnya (penekanan ditambahkan):

Teks JSON adalah urutan token. Set token mencakup enam karakter struktural, string, angka, dan tiga nama literal.

Teks JSON adalah nilai berseri . Perhatikan bahwa spesifikasi JSON tertentu sebelumnya membatasi teks JSON menjadi objek atau array. Implementasi yang hanya menghasilkan objek atau array di mana teks JSON dipanggil akan dapat dioperasikan dalam arti bahwa semua implementasi akan menerima ini sebagai teks JSON yang sesuai.


terima kasih, saya melihat angka itu berkali-kali, ternyata ada masalah dengan perpustakaan json4j, yang tidak suka json dengan [.
Tiberiu

1
@Tiberiu Hajas: Butuh beberapa saat untuk memahaminya ketika saya pertama kali menemukannya. Tetapi setelah melihat beberapa contoh JSON dan membandingkannya, saya sangat suka bagaimana mereka melakukannya. Mengenai json4j, mungkin Anda bisa mengirimkan laporan bug ke json4j perpustakaan pencipta .
Richard Marskell - Drackir

Saya mungkin terlambat ke pesta. Tapi apa yang saya temukan di RFC 8259 mengatakan bahwa teks JSON adalah urutan token yang dibentuk dari titik kode Unicode yang sesuai dengan tata bahasa nilai JSON. Set token mencakup enam token struktural, string, angka, dan tiga token nama literal. Kedengarannya seperti ini sah: {"1234"}, {true}. Namun apa yang diwakilinya? Ini bukan array, karena tidak ada <code> [] </code>, ini juga bukan objek, karena ada dua.
Nicholas Humphrey
1
@NicholasHumphrey Apa yang saya tulis di atas masih berlaku di 8259. Dalam bagian 2 yang sama (JSON Grammar) JSON-text (alias dokumen JSON) didefinisikan sebagai: di JSON-text = ws value wsmana "Nilai JSON HARUS menjadi objek, array, angka, atau string, atau salah satu dari tiga nama literal berikut: false, null, true "per Bagian 3 (Nilai). Contoh Anda tidak memenuhi batasan tersebut dan karenanya tidak valid JSON.
Richard Marskell - Drackir

Jawaban:

8

Jika string yang Anda parsing dimulai dengan tanda kurung kurawal ([) yang dapat Anda gunakan JSONArray.parseuntuk mendapatkan kembali objek JSONArray dan kemudian Anda dapat menggunakan di get(i)mana saya adalah indeks dari 0 melalui JSONArray yang dikembalikan 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();
      }
   }
}

Yang menghasilkan output seperti:

{"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"}

Catatan: jika Anda mencoba menelepon JSONObject.parse(books.toString());Anda akan mendapatkan kesalahan yang Anda temui:

java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
Nathaniel Mills
sumber
1
Kode yang lebih sederhana mungkin menggunakan instance JSONArray versus instanceof JSONObjek pada objek yang dikembalikan dari get call untuk menentukan kelas mana yang harus digunakan untuk menguraikan objek ...
Nathaniel Mills
5

SITUS WEB JSON.ORG ....

https://www.json.org/

Situs ini dengan jelas menyatakan sebagai berikut:

JSON dibangun di atas dua struktur:

  1. Kumpulan pasangan nama / nilai. Dalam berbagai bahasa, ini diwujudkan sebagai objek, catatan, struct, kamus, tabel hash, daftar kunci, atau array asosiatif.

  2. Daftar nilai yang diurutkan. Dalam sebagian besar bahasa, ini diwujudkan sebagai array, vektor, daftar, atau urutan.

Ini adalah struktur data universal. Hampir semua bahasa pemrograman modern mendukungnya dalam satu bentuk atau lainnya. Masuk akal bahwa format data yang dapat dipertukarkan dengan bahasa pemrograman juga didasarkan pada struktur ini. Di JSON, mereka mengambil formulir ini:

OBYEK:

Objek adalah kumpulan pasangan nama / nilai yang tidak teratur. Objek dimulai dengan {(kurung kiri) dan berakhir dengan} (kurung kanan). Setiap nama diikuti oleh: (titik dua) dan pasangan nama / nilai dipisahkan oleh, (koma).

{string: value, string: value}

HIMPUNAN:

Array adalah kumpulan nilai yang diurutkan. Array dimulai dengan [(braket kiri) dan diakhiri dengan] (braket kanan). Nilai dipisahkan oleh, (koma).

[value, value, value ….]

NILAI:

Nilai dapat berupa string dalam tanda kutip ganda, atau angka, atau benar atau salah atau null, atau objek atau array. Struktur ini dapat disarangkan.

TALI:

String adalah urutan nol atau lebih karakter Unicode, dibungkus dengan tanda kutip ganda, menggunakan backslash escapes. Sebuah karakter direpresentasikan sebagai string karakter tunggal. Sebuah string sangat mirip string C atau Java.

JUMLAH:

Angka sangat mirip dengan angka C atau Java, kecuali bahwa format oktal dan heksadesimal tidak digunakan.

TENTANG WHITESPACE:

Spasi dapat disisipkan di antara setiap token. Kecuali beberapa detail penyandian, itu sepenuhnya menjelaskan bahasa.

J. Moreno
sumber
Bagus dengan contoh-contohnya; itu membantu saya menyelesaikan penulisan unit test saya untuk validator JSON. Saya tidak yakin apa yang dimaksud dengan string (mis. Harus berupa string di dalam tanda kutip ganda).
gimlichael
Saya melihat bagaimana itu bisa membingungkan, kalimatnya bisa menjadi lebih ringkas dimulai sebagai berikut: "Urutan nol atau lebih karakter Unicode ...." Saya percaya penulis mungkin telah menambahkannya untuk penekanan. Saya menaruhnya dengan cara yang membuatnya lebih mudah untuk melihat beberapa poin kunci. Meski responnya terlambat, saya harap itu menambah kejelasan jika diperlukan.
J. Moreno