[json] YAML과 JSON의 차이점은 무엇입니까?

YAML과 JSON의 차이점은 무엇입니까? 특히 다음 사항을 고려하십시오.

  • 성능 (인코딩 / 디코딩 시간)
  • 메모리 소비
  • 표현 선명도
  • 라이브러리 가용성, 사용 편의성 (C를 선호합니다)

임베디드 시스템에서이 두 가지 중 하나를 사용하여 구성 파일을 저장할 계획이었습니다.

관련 :

YAML 또는 JSON을 사용하여 Perl 데이터를 저장해야합니까?



답변

기술적으로 YAML은 JSON의 상위 집합입니다. 이것은 이론적으로 적어도 YAML 파서는 JSON을 이해할 수 있지만 반드시 다른 방법은 아닙니다.

“YAML : JSON과의 관계” 섹션에서 공식 사양을 참조하십시오 .

일반적으로 JSON에서는 사용할 수없는 YAML에 대해 좋아하는 것이 있습니다.

  • 으로 @jdupont 지적 , YAML은 보는 시각 쉽습니다. 실제로 YAML 홈페이지 자체는 유효한 YAML이지만 사람이 쉽게 읽을 수 있습니다.
  • YAML에는 “앵커”를 사용하여 YAML 파일 내의 다른 항목을 참조 할 수 있습니다. 따라서 MySQL 데이터베이스에서 찾을 수있는 것처럼 관계형 정보를 처리 할 수 ​​있습니다.
  • YAML은 YAML 파일 내에 JSON 또는 XML과 같은 다른 직렬화 형식을 포함시키는 데있어 더욱 강력 합니다.

실제로이 마지막 두 가지 사항 중 어느 것도 귀 하나 내가하는 일에 중요하지 않지만 장기적으로는 YAML이보다 강력하고 실행 가능한 데이터 직렬화 형식이 될 것이라고 생각합니다.

현재 AJAX 및 기타 웹 기술은 JSON을 사용하는 경향이 있습니다. YAML은 현재 오프라인 데이터 프로세스에 더 많이 사용되고 있습니다. 예를 들어 기본적으로 C 기반 OpenCV 컴퓨터 비전 패키지에 포함되지만 JSON은 포함되지 않습니다.

JSON 및 YAML에 대한 C 라이브러리를 찾을 수 있습니다. YAML의 라이브러리는 더 새로운 경향이 있지만 과거에는 문제가 없었습니다. 예를 들어 Yaml-cpp를 참조하십시오 .


답변

차이점 :

  1. YAML은 사용 방법에 따라 JSON보다 읽기 쉽습니다.
  2. JSON은 종종 더 빠르며 더 많은 시스템과 여전히 상호 운용 가능합니다.
  3. “충분한”JSON 파서를 매우 빠르게 작성할 수 있습니다
  4. 잠재적으로 유효한 JSON 중복 키 는 확실히 유효하지 않은 YAML입니다.
  5. YAML에는 주석 및 관계형 앵커를 포함한 다양한 기능이 있습니다. 따라서 YAML 구문은 매우 복잡하므로 이해하기 어려울 수 있습니다.
  6. yaml :로 재귀 구조를 작성할 수 {a: &b [*b]}있으며 일부 변환기에서는 무한 반복됩니다. 순환 감지를 사용해도 “yaml 폭탄”이 여전히 가능합니다 ( xml bomb 참조 ).
  7. 참조가 없으므로 JSON에서 객체 참조로 복잡한 구조를 직렬화 할 수 없습니다. 따라서 YAML 직렬화가 더 효율적일 수 있습니다.
  8. 일부 코딩 환경에서 YAML을 사용하면 공격자가 임의 코드실행할 수 있습니다 .

관찰 :

  1. 파이썬 프로그래머는 일반적으로 레벨을 나타 내기 위해 괄호로 묶은 구문 대신 들여 쓰기를 사용하기 때문에 YAML의 열렬한 팬입니다.
  2. 많은 프로그래머들은 들여 쓰기에 “의미”를 붙이는 것이 좋지 않은 선택이라고 생각합니다.
  3. 데이터 형식이 응용 프로그램 환경을 떠나거나 UI 내에서 구문 분석되거나 메시징 계층으로 전송되는 경우 JSON이 더 나은 선택 일 수 있습니다.
  4. YAML은 문법 정의와 같은 복잡한 작업에 직접 사용될 수 있으며 종종 새로운 언어를 발명하는 것보다 더 나은 선택입니다.

답변

난해한 이론을 우회

이것은 나와 같은 Google 검색 결과에서 제목을 읽는 것처럼 세부 사항이 아니라 제목에 대답하므로 웹 개발자 관점에서 설명해야한다고 생각했습니다 .

  1. YAML은 공간 들여 쓰기를 사용하는데, 이는 파이썬 개발자에게 친숙한 영역입니다.
  2. JavaScript 개발자는 JSON이 JavaScript의 하위 세트이고 JSON을 선언하는 간단한 방법을 사용하여 공백없이 일반적인 변수 이름을 사용할 때 키에 큰 따옴표가 필요하지 않고 JavaScript 내부에서 직접 해석되고 작성 될 수 있기 때문에 JSON을 좋아합니다.
  3. YAML과 JSON 모두에 대해 모든 언어에서 잘 작동하는 수많은 파서가 있습니다.
  4. YAML의 공간 형식은 사람이 읽을 수있는 접근 방식이 필요하기 때문에 많은 경우에 훨씬 쉽게 볼 수 있습니다.
  5. 편집기에 공간 형식이 표시되어 있지 않으면 YAML의 형식이보다 간결하고보기 쉬워 보이지만 손으로 ​​편집하기가 어려울 수 있습니다. 탭은 공백이 아니므로 키 입력을 공백으로 해석하는 편집기가없는 경우 추가로 혼동됩니다.
  6. JSON은 YAML보다 기능이 훨씬 적기 때문에 직렬화 및 역 직렬화가 훨씬 빠르기 때문에 더 작고 가벼운 코드로 JSON을 처리 할 수 ​​있습니다.
  7. 일반적인 오해 는 YAML이 구두점을 덜 필요로하며 JSON보다 더 간결하지만, 이것은 완전히 잘못된 것입니다. 공백은 보이지 않으므로 문자가 적은 것처럼 보이지만 적절한 들여 쓰기와 함께 YAML을 올바르게 해석하는 데 필요한 실제 공백을 세면 YAML에는 실제로 JSON보다 많은 문자가 필요합니다. JSON은 공백을 사용하여 계층 구조 또는 그룹화를 나타내지 않으며보다 작은 전송을 위해 불필요한 공백을 제거하여 쉽게 병합 할 수 있습니다.

방에있는 코끼리 : 인터넷 자체

JavaScript는 웹을 크게 능가하며 JavaScript 개발자는 널리 사용되는 웹 API와 함께 JSON을 데이터 형식으로 압도적으로 사용하는 것을 선호하므로 일반적으로 웹 프로그래밍을 할 때 JSON보다 YAML을 사용하는 것이 어려워집니다. 팀 환경에서. 실제로, 대부분의 웹 프로그래머는 YAML이 존재한다는 사실조차 알지 못합니다.

웹 프로그래밍을 수행하는 경우 JavaScript를 사용하는 경우 변환 단계가 필요하지 않으므로 JSON이 기본 방법입니다. 따라서이 경우 JSON보다 YAML을 사용하려면 더 나은 인수를 사용해야합니다.


답변

이 질문은 6 살이지만, 이상하게도 실제로 네 가지 점 (속도, 기억력, 표현력, 이식성)을 모두 다루는 대답은 없습니다.

속도

분명히 이것은 구현에 따라 다르지만 JSON이 널리 사용되고 구현하기 쉽기 때문에 더 큰 기본 지원을 받고 속도가 빨라졌습니다. YAML이 JSON이 수행하는 모든 작업과 트럭로드를 더 많이 수행한다는 점을 고려하면 JSON 구현이 더 빠를 가능성이 높습니다.

그러나, YAML 파일은 JSON 대응보다는 (때문에 적은 약간 작을 수 주어진 ",문자), 그건 가능한 고도로 최적화 된 YAML 파서가 예외적 인 상황에 신속하게 될 수있다.

기억

기본적으로 동일한 주장이 적용됩니다. YAML 파서가 동일한 데이터 구조를 나타내는 경우 왜 YAML 파서가 JSON 파서보다 메모리 효율이 더 높은지 알기가 어렵습니다.

표현력

다른 사람들이 지적했듯이, 파이썬 프로그래머는 YAML, JavaScript 프로그래머는 JSON을 선호합니다. 다음과 같이 관찰하겠습니다.

  • JSON의 전체 구문을 쉽게 기억할 수 있으므로 JSON 파일의 의미를 이해하는 데 매우 확신이 있습니다. YAML은 어떤 사람도 이해할 수 없습니다. 미묘함과 엣지 케이스의 수는 극단적입니다.
  • 전체 스펙을 구현하는 구문 분석기는 거의 없으므로 주어진 컨텍스트에서 주어진 표현식의 의미를 확신하기가 더 어렵습니다.
  • JSON에 주석이 없으면 실제로는 고통입니다.

이식성

JSON 라이브러리가없는 현대 언어를 상상하기는 어렵습니다. 전체 사양보다 작은 것을 구현하는 JSON 파서를 상상하기도 어렵습니다. YAML은 광범위하게 지원되지만 JSON보다 널리 사용되지 않으며 각 파서는 다른 하위 집합을 구현합니다. 따라서 YAML 파일은 생각보다 상호 운용성이 떨어집니다.

요약

JSON은 성능 (관련된 경우) 및 상호 운용성면에서 우수합니다. YAML은 사람이 관리하는 파일에 적합합니다. HJSON 은 이식성이 크게 줄어들었지만 괜찮은 타협입니다. JSON5 는 잘 정의 된 구문으로보다 합리적인 절충안입니다.


답변

GIT 및 YAML

다른 답변은 좋습니다. 먼저 읽어보십시오. 그러나 YAML을 때때로 사용하는 또 다른 이유는 git 입니다.

점점 더 많은 프로그래밍 프로젝트에서 배포 및 보관을 위해 git 리포지토리를 사용합니다. 그리고 git repo의 히스토리는 JSON 및 YAML 파일을 동일하게 저장할 수 있지만 파일의 변경 사항을 추적하고 표시하는 데 사용되는 “diff”메소드는 행 지향적입니다. YAML은 행 지향적이어야하므로 YAML 파일의 작은 변경 사항은 사람이 쉽게 볼 수 있습니다.

물론 문자열 / 키를 정렬하고 들여 쓰기를 추가하여 JSON 파일을 “예쁘게”만들 수있는 것은 사실입니다. 그러나 이것은 기본값이 아니며 게으르다.

개인적으로 저는 일반적으로 시스템 간 상호 작용에 JSON을 사용합니다. 구성 파일, 정적 파일 및 추적 파일에 종종 YAML을 사용합니다. (또한 일반적으로 YAML 관계형 앵커를 추가하는 것을 피합니다. 루프를 찾기에는 수명이 너무 짧습니다.)

또한 속도와 공간이 실제로 문제가되는 경우 사용하지 않습니다. BSON을보고 싶을 수도 있습니다.


답변

YAML이 눈에 더 쉽다는 것을 알았습니다. 적은 괄호, “”등입니다. YAML에는 탭의 성가심이 있지만 …

성능 / 자원 측면에서, 나는 둘 사이에 큰 차이를 기대하지 않을 것입니다.

또한 구성 파일에 대해 이야기하고 있으므로 고주파수의 인코딩 / 디코딩 활동이 예상되지 않습니다.


답변

YAML이 가지고 있고 JSON에없는 기능이 필요하지 않은 경우 JSON이 매우 간단하고 광범위하게 지원되므로 많은 언어로 된 라이브러리가 많기 때문에 JSON을 선호합니다. YAML은 더 복잡하고 지원이 적습니다. 파싱 ​​속도 또는 메모리 사용이 크게 다르지 않으며 프로그램 성능의 큰 부분이 아닐 것이라고 생각합니다.