[json] JSON은 “[“로 시작할 수 있습니까?

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

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



답변

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 텍스트로 허용한다는 의미에서 상호 운용 가능합니다.


답변

구문 분석하는 문자열이 왼쪽 괄호 ([)로 시작 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: ['


답변

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 숫자와 매우 유사합니다.

화이트 스페이스 정보 :

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


답변