수색…


비고

JSON (JavaScript Object Notation) 은 원래 Douglas Crockford가 지정한 가장 널리 사용되고 널리 받아 들여지는 데이터 교환 형식 중 하나입니다.

현재이 표준은 RFC 71592ECMA-404의 두 경쟁 표준에 의해 설명됩니다. ECMA 표준은 허용되는 문법 구문 만 설명하는 반면, RFC는 몇 가지 의미 및 보안 고려 사항을 제공하므로 최소한의 것입니다.

  • JSON은 클라이언트와 서버간에 데이터를 교환하기위한 클라이언트 - 서버 아키텍처가 포함 된 소프트웨어에서 널리 사용됩니다.
  • JSON은 사용하기 쉽고 텍스트 기반, 가볍고 사람이 읽을 수있는 형식으로되어 있으며 사람들은 종종 XML을 대체하는 것으로 오해하고 있습니다.
  • 약어는 JavaScript로 시작하지만 JSON은 언어가 아니거나 언어 표기법을 사용하여 데이터 표기법에 대한 스펙 만 있습니다.
  • 거의 모든 프론트 라인 언어 / 프레임 워크와 같은 JSON 데이터 포맷을 지원하는 플랫폼 및 언어 독립적이며 inbuilt는 C #, PHP, Java, C ++, Python, Ruby 등 일부 인기있는 언어로 제공됩니다. 그리고 더 많은.
  • JSON의 공식 인터넷 미디어 유형은 application / json입니다.
  • JSON 파일 이름 확장자는 .json입니다.

버전

JSON에는 업데이트가 없으므로 JSON 버전은 1 개뿐입니다. 아래 링크는 RFC 4627 인 원본 RFC 문서로 리디렉션됩니다.

번역 출시일
기발한 2006-07-28

JSON 구문 규칙

JSON (JavaScript Object Notation) 구문은 JavaScript의 하위 집합을 기반으로합니다 ( json.org 참조).

유효한 JSON 표현식은 다음 데이터 유형 중 하나 일 수 있습니다.

  • 간단한 데이터 유형 : 문자열, 숫자, 부울, 널
  • 복합 데이터 유형 : 값, 객체, 배열

단순 데이터 유형

JSON 문자열은 큰 따옴표로 묶어야하며 0 개 이상의 유니 코드 문자를 포함 할 수 있습니다. 백 슬래시 이스케이프가 허용됩니다. 허용되는 JSON 번호는 E 표기법 입니다. Boolean은 true , false 중 하나입니다. null은 예약 된 키워드 null 입니다.

데이터 형식 유효한 JSON의 예
### String "apple"
"苹果"
"\u00c4pfel\n"
""
### 번호 3
1.4
-1.5e3
### 부울 true
false
### 없는 null

복합 데이터 유형

JSON 값은 String, Number, Boolean, Null, Object, Array 중 하나 일 수 있습니다.

목적

JSON 객체는 이름이 String이고 값이 JSON 값인 중괄호로 묶인 name : value 쌍의 쉼표로 구분 된 정렬되지 않은 컬렉션입니다.

정렬

JSON 배열은 JSON 값의 정렬 된 컬렉션입니다.

JSON 배열의 예 :

["home", "wooden"]

JSON 객체의 예 :

{
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
}

[
  1,
  2,
  [3, 4, 5, 6],
  {
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
  }
]

JSON 데이터의 유효성을 검사하고 서식을 지정하기위한 온라인 도구 :

JSON 객체

JSON 객체는 중괄호로 묶고 키 - 값 쌍을 포함합니다.

{ "key1": "value1", "key2": "value2", ... }

키는 유효한 문자열이어야하며 큰 따옴표로 묶어야합니다. 값은 JSON 객체, 숫자, 문자열, 배열 또는 다음 리터럴 이름 중 하나 ( false , null 또는 true 있습니다. 키 - 값 쌍에서 키는 콜론 값과 구분됩니다. 여러 키 - 값 쌍은 쉼표로 구분됩니다.

객체의 순서는 중요하지 않습니다. 따라서 다음 JSON 객체는 위와 같습니다.

{ "key2": "value2", "key1": "value1", ... }

모든 것을 요약하면 다음은 유효한 JSON 객체의 예입니다.

{
  "image": {
    "width":  800,
    "height": 600,
    "title":  "View from 15th Floor",
    "thumbnail": {
      "url": "http://www.example.com/image/481989943",
      "height": 125,
      "width":  100
    },
    "visible": true,
    "ids": [116, 943, 234, 38793]
  }
}

JSON 객체의 일반적인 예 (관련 객체 (Java) 객체)

이 예제에서 JSON에 직렬화되는 'root'객체는 다음 클래스의 인스턴스라고 가정합니다.

public class MyJson {
}

예제 1 : MyJson 인스턴스의 예 :

{}

즉, 클래스에는 필드가 없으므로 중괄호 만 직렬화됩니다. 중괄호는 객체를 나타내는 일반적인 구분 기호 입니다. 또한 루트 객체가 키 - 값 쌍으로 직렬화되지 않는 방법에 유의하십시오. 이것은 (외부) 객체의 필드가 아닌 간단한 유형 (문자열, 숫자, 배열)에도 해당됩니다.

예제 2 : MyJson 필드를 추가하고 몇 가지 값으로 필드를 초기화하십시오.

// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {} 

// an enriched version of our test class
public class MyJson {
  String myString = "my string";
  int myInt = 5;
  double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
  MyOtherJson objectInObject = new MyOtherJson();    
}

다음은 관련 JSON 표현입니다.

{
  "myString" : "my string",
  "myInt" : 5,
  "myArrayOfDoubles" : [ 3.14, 2.72 ],
  "objectInObject" : {}
}

모든 필드가 키 - 값 구조에서 어떻게 직렬화되는지 주목하십시오. 여기서 키는 값을 보유하는 필드의 이름입니다. 배열의 공통 구분 기호는 대괄호입니다. 또한 각 키 - 값 쌍 뒤에는 마지막 쌍을 제외하고 쉼표가옵니다.

JSON 배열

JSON 배열은 값의 정렬 된 컬렉션입니다. 그것은 대괄호 즉 [] 로 둘러싸여 있으며 값은 쉼표로 구분됩니다.

{ "colors" : [ "red", "green", "blue" ] }

JSON 배열에는 다음 두 객체 (RFC 문서에서 가져온 배열)의 예제와 같이 객체를 포함하여 유효한 JSON 요소가 포함될 수도 있습니다.

[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]

혼합 된 유형의 요소도 포함 할 수 있습니다. 예를 들면 다음과 같습니다.

[
    "red",
    51,
    true,
    null,
    {
        "state": "complete"
    }
]

JSON 배열 (및 객체)을 작성할 때 일반적인 실수는 마지막 요소 뒤에 쉼표를 남겨 두는 것입니다. 이것은 많은 언어에서 일반적인 패턴이지만 유감스럽게도 JSON에서는 유효하지 않습니다. 예를 들어 다음 배열은 유효하지 않습니다.

[
    1,
    2,
]

이것을 유효하게하려면, 마지막 요소 다음에 쉼표를 제거하여 그것을 켤 필요가 있습니다.

[
    1,
    2
]

손으로 JSON 편집하기

JSON은 매우 엄격한 형식입니다 ( http://json.org 참조 ) . 따라서 기계를 파싱하고 작성할 수 있지만 눈에 띄지 않는 실수로 인해 문서가 손상 될 경우 사람을 놀라게 할 수 있습니다.

일반적인 문제

후행 쉼표

대부분의 프로그래밍 언어와 달리 후행 쉼표를 추가 할 수 없습니다.

{
  a: 1,
  b: 2,
  c: 3
}

3 이후에 쉼표를 추가하면 synax 오류가 발생합니다.

배열에도 동일한 문제가 있습니다.

[ 
  1,
  2
]

항목을 재정렬해야 할 경우 특별히주의해야합니다.

누락 쉼표

{
  a: 1,
  b: 2,
  c: 3
  d: 4
}

후행 쉼표는 허용되지 않으므로 새 값을 추가하기 전에 하나를 추가하는 것을 잊을 수 있습니다 (이 경우 3 이후).

코멘트

JSON은 데이터 교환 형식이므로 주석을 허용하지 않습니다. 이것은 아직 사용하지 않는 것 이외의 분명한 해답이 없어도 여전히 중요한 주제입니다.

몇 가지 해결 방법이 있습니다.

  • C 스타일 주석을 사용하고, 파서에 전달하기 전에 주석을 제거하십시오
  • 데이터에 주석 삽입
{
  "//": "comment",
  "data": 1
}
  • 댓글을 포함하고 데이터로 덮어 씁니다.
{
  "data": "comment",
  "data": 1
}

두 번째 data 항목은 대부분의 파서 에서 주석 덮어 씁니다.

솔루션

JSON을 쉽게 작성하려면 구문 오류를 확인하고 구문 색을 제공하는 IDE를 사용하십시오. 대부분의 편집자는 플러그인을 사용할 수 있습니다.

애플리케이션과 툴을 개발할 때는 JSON을 내부적으로 그리고 프로토콜로 사용하되, 사람이 손으로 직접 편집해야하는 곳 (디버깅 제외)에 노출시키지 않도록하십시오.

다음과 같이이 용도에 더 적합한 다른 형식을 평가하십시오.

  • Hjson 은 JSON에서 JSON으로 완벽하게 변환 될 수 있습니다.
  • TOML , INI 파일과 유사 함
  • YAML , 더 많은 기능을 추가했지만 복잡성이 추가되었습니다.

Array 대 객체의 이론적 근거 (즉, 무엇을 사용해야하는지)

JSON 배열은 객체의 컬렉션을 나타냅니다. JS에서는 slice , pop , push 와 같은 컬렉션 기능을 제공합니다. 객체에는 원시 데이터가 더 많이 있습니다.

JSONArray정렬값의 시퀀스입니다. 외부 텍스트 형식은 값을 구분하는 쉼표로 대괄호로 묶은 문자열입니다.

JSONObject정렬되지 않은 이름 / 값 쌍 모음입니다. 외부 양식은 이름과 값 사이의 콜론과 값과 이름 사이의 쉼표가있는 중괄호로 묶은 문자열입니다.

Object - 키와 값, Array - 숫자, 문자열, 불린입니다. 언제 이것을 사용합니까?

배열은 "is a / an", Object는 "a"라고 생각할 수 있습니다. 예를 들어 "Fruit"을 사용할 수 있습니다. 과일 배열의 모든 항목은 과일의 한 유형입니다.

array fruit : [orange, mango, banana]

배열에는 객체, 문자열, 숫자, 배열이 포함될 수 있지만 객체와 배열 만 처리 할 수 ​​있습니다.

array fruit : [orange:[], mango:{}, banana:{}]

. 오렌지색도 배열임을 알 수 있습니다. 그것은 주황색으로가는 모든 항목이 주황색 유형이라고 말합니다 : bitter_orange, mandarin, sweet_orange.

과일 개체의 경우 그 안에있는 모든 항목은 과일의 특성입니다. 따라서 과일에는

object fruit :{seed:{}, endocarp:{},flesh:{}}

이것은 또한 시드 객체 내의 모든 것이 seed의 속성이어야 함을 의미합니다 (예 : color, ..).

JSON은 기본적으로 자바 스크립트 객체를 문자열로 직렬화 할 수있는 언어입니다. 따라서 JSON 문자열을 deserialize 할 때 javascript 객체 구조를 가져와야합니다. json이 object1에 100 개의 객체를 저장하는 객체로 deserialize하면 object100에 매우 불편할 것입니다. 대부분의 디시리얼라이저는 알려진 객체 및 알려진 객체의 배열을 가져야하므로 문자열을 사용중인 언어의 실제 객체 구조로 변환 할 수 있습니다. 또한 이것은 객체 지향 디자인의 철학이 당신에게 대답 할 것이라는 질문입니다.

모든 참여자에게 크레딧 JSON 배열과 JSON 객체의 차이점은 무엇입니까?



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow