JSON có thể bắt đầu với Tiếng [xông không?


178

Từ những gì tôi có thể đọc trên json.org , tất cả các chuỗi JSON phải bắt đầu bằng {(dấu ngoặc nhọn) và các [ký tự (dấu ngoặc vuông) biểu thị một phần tử mảng trong JSON.

Tôi sử dụng json4jthư viện và tôi đã nhận được một đầu vào bắt đầu [, vì vậy tôi không nghĩ đây là JSON hợp lệ. Tôi đã xem xét sơ đồ JSON một cách ngắn gọn, nhưng tôi thực sự không thể thấy nó nói rằng một tệp JSON có thể bắt đầu bằng [hoặc nó chỉ có thể bắt đầu bằng {.


(Rõ ràng có một số thư viện JSON được thiết kế xấu yêu cầu bạn biết loại JSON ngoài cùng. "Cách khắc phục" đơn giản nhất ở đây là bao quanh chuỗi JSON [], phân tích nó thành một mảng và lấy phần tử mảng đầu tiên.)
Hot Licks

Rõ ràng sẽ an toàn hơn khi bắt đầu bằng {và không [để nó không phải là một mảng Javascript hợp lệ và không thể được sử dụng cho các cuộc tấn công CSRF.
David Klempfner

Câu trả lời:


218

JSON có thể là một mảng hoặc một đối tượng. Cụ thể tắt của json.org:

JSON được xây dựng trên hai cấu trúc:

  • Một bộ sưu tập các cặp tên / giá trị. Trong các ngôn ngữ khác nhau, điều này được nhận ra dưới dạng một đối tượng, bản ghi, cấu trúc, từ điển, bảng băm, danh sách khóa hoặc mảng kết hợp.
  • Một danh sách sắp xếp các giá trị. Trong hầu hết các ngôn ngữ, điều này được nhận ra dưới dạng một
    mảng, vectơ, danh sách hoặc chuỗi.

Sau đó, tiếp tục mô tả hai cấu trúc như: Một đối tượng JSON Một mảng JSON

Lưu ý rằng các ký tự bắt đầu và kết thúc lần lượt là dấu ngoặc nhọn và dấu ngoặc vuông.

Chỉnh sửa
và từ đây: http://www.ietf.org/rfc/rfc4627.txt

Một văn bản JSON là một chuỗi các mã thông báo. Bộ mã thông báo bao gồm sáu ký tự cấu trúc, chuỗi, số và ba tên bằng chữ.

Một văn bản JSON là một đối tượng hoặc mảng được tuần tự hóa.

Cập nhật (2014)

Kể từ tháng 3 năm 2014, có một RFC JSON mới ( 7159 ) sửa đổi định nghĩa một chút (xem trang 4/5).

Định nghĩa cho mỗi RFC 4627 là: JSON-text = object / array

Điều này đã được thay đổi trong RFC 7159 thành: JSON-text = ws value ws

Trường hợp wsđại diện cho khoảng trắng và valueđược định nghĩa như sau:

Giá trị JSON PHẢI là một đối tượng, mảng, số hoặc chuỗi hoặc một trong ba tên bằng chữ sau:

false null true

Vì vậy, câu trả lời cho câu hỏi vẫn là có, văn bản JSON có thể bắt đầu bằng dấu ngoặc vuông (tức là một mảng). Nhưng ngoài các đối tượng và mảng, giờ đây nó cũng có thể là một số, chuỗi hoặc các giá trị false, nullhoặc true.

Ngoài ra, điều này đã thay đổi từ trích dẫn RFC 4627 trước đây của tôi (nhấn mạnh thêm):

Một văn bản JSON là một chuỗi các mã thông báo. Bộ mã thông báo bao gồm sáu ký tự cấu trúc, chuỗi, số và ba tên bằng chữ.

Một văn bản JSON là một giá trị nối tiếp . Lưu ý rằng một số thông số kỹ thuật trước đây của JSON đã ràng buộc một văn bản JSON là một đối tượng hoặc một mảng. Các triển khai chỉ tạo các đối tượng hoặc mảng trong đó một văn bản JSON được gọi sẽ tương thích với nhau theo nghĩa là tất cả các triển khai sẽ chấp nhận chúng như các văn bản JSON tuân thủ.


cảm ơn, tôi nhìn vào con số đó nhiều lần, rõ ràng có vấn đề với thư viện json4j, không giống như json với [.
Tiberiu

1
@Tiberiu Hajas: Tôi phải mất một chút thời gian để hiểu nó khi lần đầu tiên tìm thấy nó. Nhưng sau khi xem một số ví dụ về JSON và so sánh chúng, tôi thực sự thích cách họ đã làm nó. Về json4j, có lẽ bạn có thể gửi một báo cáo lỗi đến thư viện json4j của tác giả .
Richard Marskell - Drackir

Có lẽ tôi đến trễ bữa tiệc. Nhưng những gì tôi tìm thấy trong RFC 8259 nói rằng Văn bản JSON là một chuỗi các mã thông báo được hình thành từ các điểm mã Unicode phù hợp với ngữ pháp giá trị JSON. Bộ mã thông báo bao gồm sáu mã thông báo cấu trúc, chuỗi, số và ba mã thông báo tên theo nghĩa đen. Điều này nghe có vẻ như thế này là hợp pháp: {"1234"}, {true}. Tuy nhiên điều này thể hiện điều gì? Đây không phải là một mảng, vì không có <code> [] </ code>, đây cũng không phải là một đối tượng, bởi vì có hai trong số chúng.
Nicholas Humphrey

1
@NicholasHumphrey Những gì tôi đã viết ở trên vẫn áp dụng vào năm 8259. Trong cùng phần 2 (Ngữ pháp JSON) Văn bản JSON (còn gọi là tài liệu JSON) được định nghĩa là: JSON-text = ws value wstrong đó "Giá trị JSON PHẢI là một đối tượng, mảng, số hoặc chuỗi, hoặc một trong ba tên theo nghĩa đen sau: false, null, true "cho mỗi Phần 3 (Giá trị). Ví dụ của bạn không thỏa mãn các ràng buộc đó và do đó không phải là JSON hợp lệ.
Richard Marskell - Drackir

8

Nếu chuỗi bạn đang phân tích cú pháp bắt đầu bằng một dấu ngoặc trái ([), bạn có thể sử dụng JSONArray.parseđể lấy lại một đối tượng JSONArray và sau đó bạn có thể sử dụng get(i)trong đó tôi là một chỉ mục từ 0 thông qua các hàm JSONArray được trả về 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();
      }
   }
}

Sản lượng nào được sản xuất như:

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

Lưu ý: nếu bạn cố gọi, JSONObject.parse(books.toString());bạn sẽ gặp lỗi bạn gặp phải:

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

1
Mã đơn giản hơn có thể sử dụng thể hiện của JSONArray so với cá thể JSONObject trên đối tượng được trả về từ lệnh gọi để xác định lớp nào sẽ được sử dụng để phân tích đối tượng ...
Nathaniel Mills

5

JSON.ORG TRANG WEB SAYS ....

https://www.json.org/

Trang web nêu rõ những điều sau đây:

JSON được xây dựng trên hai cấu trúc:

  1. Một bộ sưu tập các cặp tên / giá trị. Trong các ngôn ngữ khác nhau, điều này được nhận ra dưới dạng một đối tượng, bản ghi, cấu trúc, từ điển, bảng băm, danh sách khóa hoặc mảng kết hợp.

  2. Một danh sách sắp xếp các giá trị. Trong hầu hết các ngôn ngữ, điều này được nhận ra dưới dạng một mảng, vectơ, danh sách hoặc chuỗi.

Đây là những cấu trúc dữ liệu phổ quát. Hầu như tất cả các ngôn ngữ lập trình hiện đại đều hỗ trợ chúng ở dạng này hay dạng khác. Điều có nghĩa là một định dạng dữ liệu có thể hoán đổi với các ngôn ngữ lập trình cũng được dựa trên các cấu trúc này. Trong JSON, họ có các hình thức sau:

VẬT:

Một đối tượng là một tập hợp các cặp tên / giá trị không có thứ tự. Một đối tượng bắt đầu bằng {(nẹp trái) và kết thúc bằng} (nẹp phải). Mỗi tên được theo sau: (dấu hai chấm) và các cặp tên / giá trị được phân tách bằng, (dấu phẩy).

{string: value, string: value}

MẢNG:

Một mảng là một bộ sưu tập các giá trị. Một mảng bắt đầu bằng [(dấu ngoặc trái) và kết thúc bằng] (dấu ngoặc phải). Các giá trị được phân tách bằng, (dấu phẩy).

[value, value, value ….]

GIÁ TRỊ:

Một giá trị có thể là một chuỗi trong dấu ngoặc kép, hoặc một số, hoặc đúng hoặc sai hoặc null, hoặc một đối tượng hoặc một mảng. Các cấu trúc này có thể được lồng nhau.

CHUỖI:

Chuỗi là một chuỗi gồm 0 hoặc nhiều ký tự Unicode, được gói trong dấu ngoặc kép, sử dụng các dấu gạch chéo ngược. Một ký tự được biểu diễn dưới dạng một chuỗi ký tự đơn. Một chuỗi rất giống với chuỗi C hoặc Java.

CON SỐ:

Một số rất giống với số C hoặc Java, ngoại trừ các định dạng bát phân và thập lục phân không được sử dụng.

GIỚI THIỆU VỀ WHITESPACE:

Khoảng trắng có thể được chèn giữa bất kỳ cặp mã thông báo nào. Ngoại trừ một vài chi tiết mã hóa, điều đó hoàn toàn mô tả ngôn ngữ.


Tốt với các ví dụ; nó đã giúp tôi hoàn thành việc viết bài kiểm tra đơn vị của mình cho trình xác nhận JSON. Tôi không chắc chuỗi có nghĩa là gì (ví dụ: nó phải là một chuỗi trong dấu ngoặc kép).
gimlichael

Tôi thấy làm thế nào có thể bị nhầm lẫn, câu có thể ngắn gọn hơn một chút bắt đầu như sau: "Một chuỗi các ký tự Unicode bằng 0 hoặc nhiều hơn ...." Tôi tin rằng tác giả có thể đã thêm nó để nhấn mạnh. Tôi đã trình bày nó theo cách giúp dễ dàng nhìn thấy một số điểm chính. Mặc dù phản hồi muộn, tôi hy vọng điều đó sẽ thêm phần rõ ràng nếu cần.
J. Moreno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.