JSON은 "["로 시작할 수 있습니까?


178

json.org 에서 읽을 수있는 모든 JSON 문자열은 {중괄호로 시작해야 하며 [문자 (대괄호)는 JSON의 배열 요소를 나타냅니다.

json4j라이브러리를 사용하고로 시작하는 입력을 받았 [으므로 이것이 유효한 JSON이라고 생각하지 않았습니다. JSON 스키마를 간단히 살펴 보았지만 실제로 JSON 파일로 시작할 수 없거나 [로만 시작할 수 있다고 언급하지 못했습니다 {.


(가장 바깥 쪽 JSON 유형을 알아야하는 잘못 설계된 JSON 라이브러리가 여러 개 있습니다. 여기서 가장 간단한 "수정"은 JSON 문자열을 []로 묶고 배열로 구문 분석하고 첫 번째 배열 요소를 가져 오는 것입니다.
핫 릭

분명히 {로 시작하고 {가 아닌 [로 시작하는 것이 더 안전하므로 유효한 Javascript 배열이 아니므로 CSRF 공격에 사용할 수 없습니다.
David Klempfner

답변:


218

JSON은 배열이거나 객체 일 수 있습니다. json.org에서 구체적으로 :

JSON은 두 가지 구조로 구축됩니다.

  • 이름 / 값 쌍의 모음입니다. 다양한 언어에서 이것은 객체, 레코드, 구조체, 사전, 해시 테이블, 키 목록 또는 연관 배열로 실현됩니다.
  • 정렬 된 값 목록. 대부분의 언어에서 이는
    배열, 벡터, 목록 또는 시퀀스 로 실현됩니다 .

그런 다음 두 구조를 다음과 같이 설명합니다. JSON 객체 JSON 배열

시작 및 끝 문자는 각각 중괄호와 대괄호입니다.


여기에서 편집 하십시오 : http://www.ietf.org/rfc/rfc4627.txt

JSON 텍스트는 일련의 토큰입니다. 토큰 세트에는 6 개의 구조 문자, 문자열, 숫자 및 3 개의 리터럴 이름이 포함됩니다.

JSON 텍스트는 직렬화 된 객체 또는 배열입니다.

업데이트 (2014)

2014 년 3 월 현재, 정의를 약간 수정 하는 새로운 JSON RFC ( 7159 )가 있습니다 (4/5 페이지 참조).

RFC 4627에 따른 정의는 다음과 같습니다. JSON-text = object / array

RFC 7159에서 다음과 같이 변경되었습니다. JSON-text = ws value ws

여기서 ws공백을 나타내며 value다음과 같이 정의됩니다.

JSON 값은 객체, 배열, 숫자 또는 문자열이거나 다음 세 가지 리터럴 이름 중 하나 여야합니다.

false null true

따라서 질문에 대한 대답은 여전히 ​​그렇습니다 .JSON 텍스트는 대괄호 (예 : 배열)로 시작할 수 있습니다. 그러나 객체 및 배열에 추가하여, 지금 또한 숫자, 문자열 또는 값이 될 수 있습니다 false, null또는 true.

또한 이것은 이전 RFC 4627 인용문 (강조 추가)에서 변경되었습니다.

JSON 텍스트는 일련의 토큰입니다. 토큰 세트에는 6 개의 구조 문자, 문자열, 숫자 및 3 개의 리터럴 이름이 포함됩니다.

JSON 텍스트는 직렬화 된 입니다. JSON의 특정 이전 사양에서는 JSON 텍스트를 객체 또는 배열로 제한했습니다. JSON 텍스트가 호출되는 객체 또는 배열 만 생성하는 구현은 모든 구현이이를 일치하는 JSON 텍스트로 허용한다는 의미에서 상호 운용 가능합니다.


고마워, 나는 그 숫자를 여러 번 봅니다. 분명히 json4j 라이브러리에 문제가 있습니다.
Tiberiu

1
@Tiberiu Hajas : 처음 발견했을 때 이해하는 데 시간이 조금 걸렸습니다. 그러나 JSON의 몇 가지 예를보고 비교 한 후에는 실제로 어떻게했는지 좋아합니다. json4j와 관련하여 버그 보고서를 json4j 라이브러리의 작성자 에게 제출할 수 있습니다 .
Richard Marskell-Drackir

아마 파티에 늦었을 것입니다. 그러나 RFC 8259에서 찾은 내용은 JSON 텍스트는 JSON 값 문법을 따르는 유니 코드 코드 포인트로 구성된 일련의 토큰이라고 말합니다. 토큰 세트에는 6 개의 구조 토큰, 문자열, 숫자 및 3 개의 리터럴 이름 토큰이 포함됩니다. 이는 합법적 인 것 같습니다 : { "1234"}, {true}. 그러나 이것은 무엇을 의미합니까? 이것은 <code> [] </ code>가 없기 때문에 배열이 아니며,이 둘도 있기 때문에이 둘도 객체가 아닙니다.
니콜라스 험프리

1
@NicholasHumphrey 위에서 작성한 내용은 여전히 ​​8259에 적용됩니다. 동일한 섹션 2 (JSON Grammar)에서 JSON 텍스트 (JSON 문서)는 다음과 같이 정의됩니다. JSON-text = ws value ws여기서 "JSON 값은 객체, 배열, 숫자 또는 문자열이어야합니다. 또는 섹션 3 (값)에 따라 다음 세 가지 리터럴 이름 중 하나 인 false, null, true "입니다. 귀하의 예는 이러한 제약 조건을 만족하지 않으므로 유효한 JSON이 아닙니다.
Richard Marskell-Drackir

8

구문 분석하는 문자열이 왼쪽 괄호 ([)로 시작 JSONArray.parse하는 경우 JSONArray 객체를 가져 오는 데 사용할 수 있으며 get(i)여기서 i 는 0에서 반환 된 JSONArray를 통해 인덱스입니다 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();
      }
   }
}

다음과 같은 출력을 생성했습니다.

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

참고 : 전화를 걸면 JSONObject.parse(books.toString());오류가 발생합니다.

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

1
보다 간단한 코드는 get 호출에서 반환 된 객체에서 JSONArray와 JSONObject의 instance를 사용하여 객체를 구문 분석하는 데 사용할 클래스를 결정할 수 있습니다.
Nathaniel Mills

5

JSON.ORG 웹 사이트 SAYS ....

https://www.json.org/

이 사이트에는 다음이 명확하게 명시되어 있습니다.

JSON은 두 가지 구조로 구축됩니다.

  1. 이름 / 값 쌍의 모음입니다. 다양한 언어에서 이것은 객체, 레코드, 구조체, 사전, 해시 테이블, 키 목록 또는 연관 배열로 실현됩니다.

  2. 정렬 된 값 목록. 대부분의 언어에서 이는 배열, 벡터, 목록 또는 시퀀스로 실현됩니다.

이들은 보편적 인 데이터 구조입니다. 사실상 모든 현대 프로그래밍 언어는 한 형태로 지원합니다. 프로그래밍 언어와 호환 가능한 데이터 형식도 이러한 구조를 기반으로합니다. JSON에서는 다음과 같은 형식을 취합니다.

목적:

객체는 순서가없는 이름 / 값 쌍 세트입니다. 객체는 {(왼쪽 괄호)로 시작하고} (오른쪽 괄호)로 끝납니다. 각 이름 뒤에는 :( 콜론)이 있고 이름 / 값 쌍은, (쉼표)로 구분됩니다.

{string: value, string: value}

정렬:

배열은 정렬 된 값 모음입니다. 배열은 [(왼쪽 대괄호)로 시작하고] (오른쪽 대괄호)로 끝납니다. 값은, (쉼표)로 구분됩니다.

[value, value, value ….]

값:

값은 큰 따옴표로 묶은 문자열이거나 숫자이거나 true 또는 false 또는 null이거나 객체 또는 배열 일 수 있습니다. 이러한 구조는 중첩 될 수 있습니다.

끈:

문자열은 백 슬래시 이스케이프를 사용하여 큰 따옴표로 묶은 0 개 이상의 유니 코드 문자 시퀀스입니다. 문자는 단일 문자열로 표시됩니다. 문자열은 C 또는 Java 문자열과 매우 유사합니다.

번호:

숫자는 8 진수 및 16 진수 형식이 사용되지 않는다는 점을 제외하면 C 또는 Java 숫자와 매우 유사합니다.

화이트 스페이스 정보 :

임의의 토큰 쌍 사이에 공백을 삽입 할 수 있습니다. 몇 가지 인코딩 세부 사항을 제외하고 언어를 완전히 설명합니다.


예제를 잘 활용하십시오. JSON 유효성 검사기의 단위 테스트 작성을 완료하는 데 도움이되었습니다. 문자열의 의미가 무엇인지 잘 모르겠습니다 (예 : 큰 따옴표 안에있는 문자열이어야 함).
gimlichael

나는 그것이 어떻게 혼동 될 수 있는지, 문장은 다음과 같이 시작하여 조금 더 간결했을 수있다. "0 개 이상의 유니 코드 문자의 순서 ..." 핵심 요점을보다 쉽게 ​​볼 수있는 방식으로 배치했습니다. 답변이 늦었지만 필요한 경우 명확성을 추가하기를 바랍니다.
J. Moreno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.