Sự khác biệt giữa YAML và JSON là gì?


735

Sự khác biệt giữa YAML và JSON, cụ thể là xem xét những điều sau đây là gì?

  • Hiệu suất (thời gian mã hóa / giải mã)
  • Tiêu thụ bộ nhớ
  • Biểu hiện rõ ràng
  • Thư viện sẵn có, dễ sử dụng (tôi thích C)

Tôi đã dự định sử dụng một trong hai thứ này trong hệ thống nhúng của chúng tôi để lưu trữ các tệp cấu hình.

Liên quan:

Tôi nên sử dụng YAML hoặc JSON để lưu trữ dữ liệu Perl của mình?


26
Xin lưu ý rằng JSON có thể được coi là tập hợp con của YAML: en.wikipedia.org/wiki/JSON#YAML
Charles

2
@ Charles, vâng, nhưng họ có một số khác biệt tinh tế: ajaxian.com/archives/json-yaml-its-getting-closer-to-truth
pierrotlefou

1
Vì YAML (xấp xỉ) là một siêu nhóm JSON, nên câu hỏi về hiệu năng không thể được trả lời mà không có giả định về việc bạn sẽ sử dụng tính biểu cảm đó hay không. Nếu bạn không cần nó: trình phân tích cú pháp YAML nhanh như thế nào khi đọc JSON? Nếu bạn cần nó: trình phân tích cú pháp JSON chậm hơn bao nhiêu khi bạn cho phép biểu diễn JSON có thể dài hơn của cùng một ý tưởng?
poolie

@jokoon Tôi đoán "Tôi thích thư viện C" (ví dụ libyaml)
dbr

4
Tài liệu YAML thể phức tạp và khó đọc. Một cuộc tấn công "Tỷ tỷ cười" là có thể với YAML. Mặt khác, các đối tượng phức tạp, đồ thị và các cấu trúc khác có thể được tuần tự hóa một cách hiệu quả trong YAML. Đối với các định dạng trao đổi và các cấu trúc đơn giản, JSON được ưu tiên. Đối với tuần tự hóa đối tượng phức tạp hoặc cho các định nghĩa ngữ pháp, YAML có thể được ưu tiên.
Erik Aronesty

Câu trả lời:


656

Về mặt kỹ thuật YAML là một siêu bộ của JSON. Điều này có nghĩa là, về lý thuyết, ít nhất, một trình phân tích cú pháp YAML có thể hiểu JSON, nhưng không nhất thiết phải theo cách khác.

Xem thông số kỹ thuật chính thức, trong phần có tên "YAML: Liên quan đến JSON" .

Nói chung, có một số điều tôi thích về YAML không có sẵn trong JSON.

  • Như @jdupont đã chỉ ra , YAML dễ nhìn hơn. Trên thực tế, trang chủ YAML tự nó là YAML hợp lệ, nhưng con người rất dễ đọc.
  • YAML có khả năng tham chiếu các mục khác trong tệp YAML bằng cách sử dụng "neo". Do đó, nó có thể xử lý thông tin quan hệ như người ta có thể tìm thấy trong cơ sở dữ liệu MySQL.
  • YAML mạnh mẽ hơn về việc nhúng các định dạng tuần tự hóa khác như JSON hoặc XML trong tệp YAML.

Trong thực tế, cả hai điểm cuối này đều không có khả năng quan trọng đối với những việc mà bạn hoặc tôi làm, nhưng về lâu dài, tôi nghĩ YAML sẽ là một định dạng tuần tự hóa dữ liệu mạnh mẽ và khả thi hơn.

Ngay bây giờ, AJAX và các công nghệ web khác có xu hướng sử dụng JSON. YAML hiện đang được sử dụng nhiều hơn cho các quy trình dữ liệu ngoại tuyến. Ví dụ, nó được bao gồm theo mặc định trong gói thị giác máy tính OpenCV dựa trên C, trong khi JSON thì không.

Bạn sẽ tìm thấy các thư viện C cho cả JSON và YAML. Các thư viện của YAML có xu hướng mới hơn, nhưng tôi không gặp rắc rối với chúng trong quá khứ. Xem ví dụ Yaml-cpp .


199
json không phải là một tập hợp con (mặc dù nó gần) và sự không tương thích đang gây phẫn nộ khi bạn trang bị chúng. thư viện json thường nhanh hơn ... ( stackoverflow.com/questions/2451732/, ). những người đề xướng yaml sẽ nhấn mạnh rằng đó là một tập hợp con. nếu khả năng đọc là một mối quan tâm, sử dụng yaml. nếu khả năng tương tác và tốc độ là một mối quan tâm, hãy sử dụng JSON.
Erik Aronesty

6
YAML là một siêu bộ của một dạng cú pháp JSON cụ thể. Đó là, nếu bạn sử dụng JSON theo cách tương thích với YAML, thì đó là một tập hợp con thích hợp. Như pierr đã nhận xét ở trên, thông số kỹ thuật là [hướng tới khả năng tương thích] (ajaxian.com/archives/json-yaml-its-getting-closer-to-truth).
ness101

120
Ngoài ra YAML hỗ trợ bình luận rất tiện dụng.
Den

59
@ErikAronesty JSON gần với một tập hợp con của YAML 1.1, nhưng kể từ YAML 1.2, giờ đây nó là một tập hợp con thực sự. YAML 1.2 chủ yếu được phát hành để giải quyết một vài điểm không tương thích cuối cùng giữa hai thông số kỹ thuật.
00prometheus

64
Từ thông số YAML 1.2 : "Mục tiêu chính của sửa đổi này là đưa YAML tuân thủ JSON như một tập hợp con chính thức."
Rich C

204

Sự khác biệt:

  1. YAML, tùy thuộc vào cách bạn sử dụng nó, có thể dễ đọc hơn JSON
  2. JSON thường nhanh hơn và có thể vẫn tương thích với nhiều hệ thống hơn
  3. Có thể viết một trình phân tích cú pháp JSON "đủ tốt" rất nhanh
  4. Các khóa trùng lặp, có khả năng là JSON hợp lệ, chắc chắn là YAML không hợp lệ.
  5. YAML có rất nhiều tính năng, bao gồm các bình luận và các neo quan hệ. Cú pháp YAML theo đó khá phức tạp và có thể khó hiểu.
  6. Có thể viết các cấu trúc đệ quy trong yaml : {a: &b [*b]}, nó sẽ lặp vô hạn trong một số bộ chuyển đổi. Ngay cả khi phát hiện vòng tròn, "bom yaml" vẫn có thể (xem bom xml ).
  7. Do không có tài liệu tham khảo nên không thể tuần tự hóa các cấu trúc phức tạp với các tham chiếu đối tượng trong JSON. Do đó tuần tự YAML có thể hiệu quả hơn.
  8. Trong một số môi trường mã hóa, việc sử dụng YAML có thể cho phép kẻ tấn công thực thi mã tùy ý .

Quan sát:

  1. Các lập trình viên Python nói chung là những người hâm mộ lớn của YAML, vì sử dụng thụt lề, thay vì cú pháp ngoặc, để chỉ các mức.
  2. Nhiều lập trình viên coi việc đính kèm "ý nghĩa" để thụt lề là một lựa chọn kém.
  3. Nếu định dạng dữ liệu sẽ rời khỏi môi trường của ứng dụng, được phân tích cú pháp trong giao diện người dùng hoặc được gửi trong lớp nhắn tin, JSON có thể là lựa chọn tốt hơn.
  4. YAML có thể được sử dụng, trực tiếp, cho các nhiệm vụ phức tạp như định nghĩa ngữ pháp và thường là lựa chọn tốt hơn so với việc phát minh ra một ngôn ngữ mới.

9
Nó là. Toàn bộ mục đích của Yaml 1.2 là giải quyết một vài khác biệt về khả năng tương thích để biến JSON thành một tập hợp con nghiêm ngặt. Nếu bạn tin rằng thông số kỹ thuật không đạt được mục đích của nó, Erik, vui lòng chỉ ra một ví dụ ở đâu đó về JSON hợp lệ vi phạm thông số YAML và / hoặc phá vỡ trình phân tích cú pháp YAML tương thích 1.2 đã được xác minh.
SFEley

32
@SFEley Thông số YAML cho biết có các tệp JSON hợp lệ tiềm năng sẽ không hợp lệ YAML. Nhưng nó không có khả năng sử dụng thực sự. "RFC4627 của JSON yêu cầu các khóa ánh xạ chỉ đơn giản là NÊN NÊN duy nhất, trong khi YAML khẳng định họ PHẢI PHẢI. Về mặt kỹ thuật, YAML tuân thủ thông số JSON, chọn xử lý trùng lặp là lỗi. Thực tế, vì JSON im lặng. ngữ nghĩa của các bản sao như vậy, các tệp JSON di động duy nhất là các tệp có khóa duy nhất, do đó là các tệp YAML hợp lệ. " - yaml.org/spec/1.2/spec.html#id2759572
David C. Giám mục

9
Để nhận xét về việc sử dụng thụt lề; tốt, tôi tin rằng có thể cần phải làm quen và không phải ai cũng thích nó. Ví dụ, tôi là một chàng trai .NET. Tôi đã xem xét một tập tin travis.yml và tự hỏi tại sao có vấn đề. Tôi phát hiện ra rằng tôi có một tab mà nó không tồn tại. Không phải ai cũng quen với những thứ nổ tung do không gian / tab / tùy chọn dòng mới.
Phil

10
Các tab đơn giản là không được phép ở tất cả như các ký tự thụt. IMHO, đó là phong cách mã hóa tốt trong tất cả các ngôn ngữ - có hoặc không có thụt cú pháp.
00prometheus

6
@Wyrmwood Cá nhân tôi thích python và YAML và thực sự sử dụng chúng mỗi ngày. Tôi có xu hướng sử dụng YAML cho những thứ mọi người phải chỉnh sửa thường xuyên và JSON cho những thứ mà mọi người "có thể" cần xem xét. Tôi đã phải chịu sự chỉ trích hợp lệ bởi các nhà phát triển C ++, những người nhận thấy sự thụt vào gây nhầm lẫn .... đặc biệt là nếu có nhiều cấp độ hoặc các khối chức năng dài hơn. Tất nhiên ... mã kiểm tra tốt không có những thứ đó, vì vậy nó thường không phải là vấn đề. Đây là quan sát cá nhân của tôi, nhưng bất kỳ tìm kiếm google thông thường nào cũng sẽ mang lại nhiều kết quả ... vì vậy nó không quan trọng để xác minh.
Erik Aronesty

89

Bỏ qua lý thuyết bí truyền

Điều này trả lời tiêu đề, không phải chi tiết vì hầu hết chỉ đọc tiêu đề từ kết quả tìm kiếm trên google như tôi nên tôi cảm thấy cần phải giải thích từ góc độ nhà phát triển web .

  1. YAML sử dụng thụt lề không gian, là lãnh thổ quen thuộc cho các nhà phát triển Python.
  2. Các nhà phát triển JavaScript yêu thích JSON vì đây là một tập hợp con của JavaScript và có thể được giải thích và viết trực tiếp bên trong JavaScript, cùng với việc sử dụng một cách tốc ký để khai báo JSON, không yêu cầu dấu ngoặc kép trong các khóa khi sử dụng tên biến điển hình không có dấu cách.
  3. Có rất nhiều trình phân tích cú pháp hoạt động rất tốt trong tất cả các ngôn ngữ cho cả YAML và JSON.
  4. Định dạng không gian của YAML có thể dễ nhìn hơn trong nhiều trường hợp vì định dạng đòi hỏi cách tiếp cận dễ đọc hơn của con người.
  5. Hình thức của YAML trong khi gọn hơn và dễ nhìn hơn có thể khó chỉnh sửa bằng tay nếu bạn không có định dạng không gian hiển thị trong trình chỉnh sửa của mình. Các tab không phải là khoảng trắng để gây nhầm lẫn thêm nếu bạn không có trình chỉnh sửa để diễn giải các lần nhấn phím của bạn vào khoảng trắng.
  6. JSON nhanh hơn nhiều để tuần tự hóa và giải tuần tự hóa vì các tính năng ít hơn đáng kể so với YAML để kiểm tra, cho phép mã nhỏ hơn và nhẹ hơn để xử lý JSON.
  7. Một quan niệm sai lầm phổ biến là YAML cần ít dấu câu hơn và nhỏ gọn hơn JSON nhưng điều này hoàn toàn sai. Khoảng trắng là vô hình nên có vẻ như có ít ký tự hơn, nhưng nếu bạn tính khoảng trắng thực sự cần thiết để YAML được giải thích chính xác cùng với thụt lề thích hợp, bạn sẽ thấy YAML thực sự cần nhiều ký tự hơn JSON. JSON không sử dụng khoảng trắng để biểu thị phân cấp hoặc nhóm và có thể dễ dàng làm phẳng với khoảng trắng không cần thiết được loại bỏ để vận chuyển nhỏ gọn hơn.

Con voi trong phòng: Internet

JavaScript chiếm ưu thế rõ ràng trên web bởi một biên độ lớn và các nhà phát triển JavaScript thích sử dụng JSON vì định dạng dữ liệu áp đảo cùng với các API web phổ biến nên khó tranh luận khi sử dụng YAML so với JSON khi thực hiện lập trình web theo nghĩa chung vì bạn có thể sẽ bị bỏ xa trong môi trường làm việc nhóm Trên thực tế, phần lớn các lập trình viên web thậm chí không biết YAML tồn tại, chứ đừng nói đến việc sử dụng nó.

Nếu bạn đang thực hiện bất kỳ chương trình web nào, JSON là cách mặc định vì không cần bước dịch khi làm việc với JavaScript, do đó bạn phải đưa ra một đối số tốt hơn để sử dụng YAML so với JSON trong trường hợp đó.


10
Tôi không đồng ý rằng các nhà phát triển python thích YAML. Pythons dict là JSON cơ bản, danh sách các dicts về cơ bản cũng là JSON. Python đã xây dựng trong lib json. Bên cạnh đó, tôi là một nhà phát triển python và tôi thích JSON (hầu hết các nhà phát triển python tôi biết đều thích JSON).
karantan

6
Một điều thực sự làm phiền tôi về không gian trắng là việc dễ bị nhầm lẫn và hiểu sai như thế nào khi thụt vào hoặc không có nghĩa là nó được lồng hoặc ở cùng cấp độ và cũng rất dễ bị lỗi nếu bạn không có một quy tắc hướng dẫn. Nó giống như các oops ẩn này thực sự không phải là kịch bản loại dễ dàng mà không ai nói khi chỉnh sửa yaml. không bao giờ có vấn đề với json.
Jason Sebring

6
@JasonSebring. Bạn gần như tự hỏi tại sao YAML lại đi với không gian. Lần đầu tiên "ngâm mình trong đại dương" YAML của tôi đã dẫn đến một ứng dụng bị hỏng ... tất cả chỉ vì không gian. Bạn đã nghĩ rằng có thể sử dụng một vết lõm không sử dụng ký tự không in sẽ có ý nghĩa hơn nhiều! (Đó là, tại sao trên trái đất họ không chọn '.' Thay vì ''?) Để hiểu YAML, bạn phải đi đến thông số kỹ thuật. Để hiểu JSON không cần điều đó. (Tôi đã từng đến trước, và không bao giờ sau này). Điều này với tôi chỉ ra một định dạng không thực sự 'có thể đọc được'
cmroanirgo

7
@cmroanirgo yah đây là kinh nghiệm của tôi. Sếp của tôi đã buộc chúng tôi sử dụng YAML trên JSON và nó khiến mọi thứ trở nên nhảm nhí một cách không cần thiết để chỉnh sửa và ăn nhập. Tôi đã viết điều này bởi vì hy vọng rằng phiếu bầu sẽ minh chứng cho tôi.
Jason Sebring

3
Rắc rối với các tab trong YAML có nghĩa là (a) không đọc thông báo lỗi và (b) có trình chỉnh sửa không làm nổi bật các tab. Cả hai vấn đề đều dễ dàng được chỉnh sửa, vì vậy tôi không hiểu các khiếu nại.
toolforger

38

Câu hỏi này đã 6 tuổi, nhưng thật kỳ lạ, không có câu trả lời nào thực sự giải quyết được cả bốn điểm (tốc độ, trí nhớ, tính biểu cảm, tính di động).

Tốc độ

Rõ ràng điều này phụ thuộc vào việc triển khai, nhưng vì JSON được sử dụng rộng rãi và rất dễ thực hiện, nên nó có xu hướng nhận được hỗ trợ riêng lớn hơn và do đó tăng tốc. Xem xét rằng YAML thực hiện mọi thứ mà JSON làm, cộng với tải trọng xe tải nhiều hơn, có khả năng là bất kỳ triển khai nào có thể so sánh của cả hai, JSON sẽ nhanh hơn.

Tuy nhiên, do tệp YAML có thể nhỏ hơn một chút so với đối tác JSON của nó (do ít hơn ",ký tự), nên có thể trình phân tích cú pháp YAML được tối ưu hóa cao có thể nhanh hơn trong các trường hợp đặc biệt.

Ký ức

Về cơ bản lập luận tương tự được áp dụng. Thật khó để hiểu tại sao trình phân tích cú pháp YAML sẽ hiệu quả bộ nhớ hơn trình phân tích cú pháp JSON, nếu chúng đại diện cho cùng một cấu trúc dữ liệu.

Biểu cảm

Như những người khác lưu ý, các lập trình viên Python có xu hướng thích YAML, lập trình viên JavaScript đối với JSON. Tôi sẽ thực hiện những quan sát này:

  • Thật dễ dàng để ghi nhớ toàn bộ cú pháp của JSON và do đó rất tự tin về việc hiểu ý nghĩa của bất kỳ tệp JSON nào. YAML không thực sự dễ hiểu bởi bất kỳ con người. Số lượng tinh tế và trường hợp cạnh là cực kỳ.
  • Vì ít trình phân tích cú pháp triển khai toàn bộ thông số kỹ thuật, nên càng khó chắc chắn hơn về ý nghĩa của một biểu thức đã cho trong một ngữ cảnh cụ thể.
  • Việc thiếu các bình luận trong JSON là, thực tế, là một nỗi đau thực sự.

Tính di động

Thật khó để tưởng tượng một ngôn ngữ hiện đại mà không có thư viện JSON. Thật khó để tưởng tượng một trình phân tích cú pháp JSON thực hiện bất cứ điều gì ít hơn thông số kỹ thuật đầy đủ. YAML có hỗ trợ rộng rãi, nhưng ít phổ biến hơn JSON và mỗi trình phân tích cú pháp thực hiện một tập hợp con khác nhau. Do đó các tệp YAML ít tương tác hơn bạn nghĩ.

Tóm lược

JSON là người chiến thắng về hiệu suất (nếu có liên quan) và khả năng tương tác. YAML là tốt hơn cho các tập tin duy trì con người. HJSON là một sự thỏa hiệp tốt mặc dù với tính di động giảm đi nhiều. JSON5 là một sự thỏa hiệp hợp lý hơn, với cú pháp được xác định rõ.


3
Tôi thực sự nghĩ YAML nhỏ hơn vì những nhân vật vô hình đã lừa tôi như vậy. Vô hình => Không có, thực ra cũng không. Nếu bạn đếm các ký tự vô hình phải ở đó, đặc biệt là khi YAML được lồng lớn hơn, nó sẽ nhanh chóng vượt qua JSON. Tôi chỉ nghĩ rằng điều đó rất thú vị khi phần dễ đọc của con người đánh lừa hầu hết chúng ta vào khái niệm đó cho đến khi tôi thực sự nghĩ về nó vì bạn có thể làm phẳng JSON và YAML, không quá nhiều. Tôi cũng thấy YAML rất khó chỉnh sửa bằng tay, không đọc, chỉ chỉnh sửa khi bạn cần bật hướng dẫn biên tập, dễ dàng nhầm lẫn các mục lồng nhau.
Jason Sebring

1
Tôi cảm thấy rằng không có câu trả lời nào ở đây nêu rõ điều này: "Đối với các tệp cài đặt / cấu hình, YAML tốt hơn (vì các lý do được đề cập ở trên bởi mọi người). Đối với máy / máy xen kẽ, hãy sử dụng JSON". Nói cách khác: nếu đối tượng mục tiêu của bạn là một con người, YAML sẽ tốt hơn. Nếu mục tiêu là một chương trình khác (nhưng bạn vẫn muốn dữ liệu có thể đọc được ở người), hãy sử dụng JSON.
Florin T.

Điều đó đúng, nhưng câu hỏi đặt ra một số thông số khá cụ thể về cách họ muốn hai người so sánh. Cá nhân, tôi sẽ không bao giờ sử dụng YAML cho bất cứ điều gì. Tôi sẽ sử dụng JSON cho khả năng tương tác hoặc JSON6 nếu việc bảo trì của con người là quan trọng.
Steve Bennett

29

GIT và YAML

Các câu trả lời khác là tốt. Đọc những cái đó trước. Nhưng đôi khi tôi sẽ thêm một lý do khác để sử dụng YAML: git .

Càng ngày, nhiều dự án lập trình sử dụng kho git để phân phối và lưu trữ. Và, trong khi lịch sử của git repo có thể lưu trữ các tệp JSON và YAML như nhau, phương thức "diff" được sử dụng để theo dõi và hiển thị các thay đổi đối với tệp được định hướng theo dòng. Vì YAML bị buộc phải định hướng theo dòng, nên bất kỳ thay đổi nhỏ nào trong tệp YAML đều dễ thấy hơn đối với con người.

Tất nhiên, đúng là các tệp JSON có thể được "làm đẹp" bằng cách sắp xếp các chuỗi / khóa và thêm thụt lề. Nhưng đây không phải là mặc định và tôi lười biếng.

Cá nhân, tôi thường sử dụng JSON để tương tác giữa các hệ thống. Tôi thường sử dụng YAML cho các tệp cấu hình, tệp tĩnh và tệp được theo dõi. (Tôi cũng thường tránh thêm các neo quan hệ YAML. Cuộc sống quá ngắn để săn lùng các vòng lặp.)

Ngoài ra, nếu tốc độ và không gian thực sự là một mối quan tâm, tôi cũng không sử dụng. Bạn có thể muốn nhìn vào BSON.


22

Tôi thấy YAML trở nên dễ nhìn hơn: ít dấu ngoặc đơn hơn, "" v.v ... Mặc dù có sự khó chịu của các tab trong YAML ... nhưng người ta sẽ hiểu được.

Về hiệu suất / tài nguyên, tôi sẽ không mong đợi sự khác biệt lớn giữa hai.

Hơn nữa, chúng ta đang nói về các tệp cấu hình và vì vậy tôi sẽ không mong đợi tần suất cao của hoạt động mã hóa / giải mã, phải không?


22
Tôi tự hỏi ý của bạn là gì bởi sự khó chịu của các tab . Tôi tin rằng điều này là các ký tự tab không được phép trong yaml , mà cá nhân tôi nghĩ là một ý tưởng tốt trong bất kỳ tệp nguồn nào .
poolie

6
@poolie: jldupont có khả năng đề cập đến khoảng trắng hàng đầu có ý nghĩa về mặt cú pháp trong YAML.
nè 101

10
OK nhưng chúng không phải là tab.
poolie

20

Nếu bạn không cần bất kỳ tính năng nào mà YAML có và JSON không có, tôi sẽ thích JSON vì nó rất đơn giản và được hỗ trợ rộng rãi (có rất nhiều thư viện bằng nhiều ngôn ngữ). YAML phức tạp hơn và có ít hỗ trợ hơn. Tôi không nghĩ tốc độ phân tích cú pháp hoặc sử dụng bộ nhớ sẽ khác nhau rất nhiều và có thể không phải là một phần lớn trong hiệu suất chương trình của bạn.


3
YAML phức tạp hơn theo cách nào?
Accatyyc

18
Ví dụ, YAML hỗ trợ các neo, như đã được ghi chú trong một câu trả lời khác. Có các tính năng khác, chẳng hạn như các loại dữ liệu mở rộng. Điều này làm cho việc phân tích cú pháp phức tạp hơn và giải thích tại sao YAML có thông số kỹ thuật lớn hơn. Nó có thể ảnh hưởng đến hiệu suất tùy thuộc vào việc triển khai trình phân tích cú pháp (hãy xem câu hỏi này: stackoverflow.com/questions/2451732/ mẹo ).
Anton Strogonoff

5
Sự phức tạp sẽ tốt hơn sự đơn giản nếu sự phức tạp đó mua cho bạn sức mạnh để đạt được sự đơn giản tổng thể lớn hơn. Điều đó chắc chắn đúng tùy thuộc vào độ phức tạp của mô hình dữ liệu của bạn.
Jonathan Neufeld

3
Tôi có thể hơi muộn ở đây nhưng YAML có thể thêm ý kiến ​​trong khi JSON thì không. Đối với tôi, nó là một trợ giúp lớn khi nói đến tài liệu về thông số kỹ thuật
Moses Liao GZ

@Accatyyc. Tôi nghĩ rằng việc mọi người ở đây đặt câu hỏi về sự khác biệt là một dấu hiệu chắc chắn YAML không dễ dàng như vậy. Tôi chưa bao giờ hỏi một câu hỏi về JSON (ngoại trừ "tại sao tôi không thể có ý kiến ​​trong đó?")
cmroanirgo

15

Về mặt kỹ thuật YAML cung cấp nhiều hơn JSON (YAML v1.2 là siêu bộ JSON):

  • bình luận
  • neo và thừa kế - ví dụ về 3 mục giống nhau:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
  • ...

Hầu hết mọi người sẽ không sử dụng các tính năng bổ sung đó và sự khác biệt chính là YAML sử dụng thụt lề trong khi JSON sử dụng dấu ngoặc . Điều này làm cho YAML ngắn gọn và dễ đọc hơn (đối với mắt được đào tạo).

Chọn cái nào?

  • Các tính năng bổ sung YAML và ký hiệu ngắn gọn làm cho nó trở thành một lựa chọn tốt cho các tệp cấu hình ( các tệp không do người dùng cung cấp).
  • Các tính năng hạn chế của JSON , hỗ trợ rộng và phân tích cú pháp nhanh hơn làm cho nó trở thành một lựa chọn tuyệt vời cho khả năng tương tác và dữ liệu do người dùng cung cấp .

4

Vì câu hỏi này hiện nổi bật khi tìm kiếm YAML và JSON, nên đáng chú ý một sự khác biệt hiếm khi được trích dẫn giữa hai: giấy phép. JSON có nghĩa là phải có giấy phép mà người dùng JSON phải tuân thủ (bao gồm cả "không rõ ràng về mặt pháp lý" sẽ được sử dụng cho Tốt chứ không phải Ác "). YAML không có yêu cầu cấp phép như vậy và đó có thể là một sự khác biệt quan trọng (đối với luật sư của bạn, nếu không phải với bạn).


Tôi không sử dụng JSON, tôi sử dụng tương đương chính xác với JSON mà không gọi nó là JSON. Tôi gọi nó là PS-OFF. Bạn sẽ kiện tôi vì đã sử dụng { "": #, [] }???
Andrew

4

Đôi khi bạn không phải quyết định cái này hơn cái kia.

Ví dụ, trong Go, bạn có thể có cả hai cùng một lúc:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

3

Từ: Sách của Arnaud Lauret, Thiết kế API Web. :

Định dạng dữ liệu JSON

JSON là một định dạng dữ liệu văn bản dựa trên cách ngôn ngữ lập trình JavaScript mô tả dữ liệu, nhưng, mặc dù tên của nó, hoàn toàn độc lập với ngôn ngữ (xem https://www.json.org/ ). Sử dụng JSON , bạn có thể mô tả các đối tượng chứa các cặp tên / giá trị không có thứ tự và cả các mảng hoặc danh sách chứa các giá trị được sắp xếp, như trong hình này.

nhập mô tả hình ảnh ở đây

Một đối tượng được phân định bằng dấu ngoặc nhọn ({}). Tên là một chuỗi được trích dẫn ("tên") và được phân tách từ giá trị của nó bằng dấu hai chấm (:). Một giá trị có thể là một chuỗi như "value", một số như 1.23, Boolean (đúng hoặc sai), giá trị null null, một đối tượng hoặc một mảng. Một mảng được phân cách bằng dấu ngoặc ([]) và các giá trị của nó được phân tách bằng dấu phẩy (,). các JSON định dạng có thể dễ dàng phân tích cú pháp sử dụng bất kỳ ngôn ngữ lập trình. Nó cũng tương đối dễ đọc và viết. Nó được áp dụng rộng rãi cho nhiều mục đích sử dụng như cơ sở dữ liệu, tập tin cấu hình và tất nhiên là API.

YAML

YAML (YAML Ain't Markup Language) là một định dạng tuần tự hóa dữ liệu thân thiện với con người. Giống như JSON, YAML ( http://yaml.org ) là định dạng dữ liệu khóa / giá trị. Hình vẽ cho thấy một so sánh của hai.

nhập mô tả hình ảnh ở đây

Lưu ý các điểm sau:

  • Không có dấu ngoặc kép ("") xung quanh tên và giá trị thuộc tính trong YAML .

  • Các dấu ngoặc nhọn cấu trúc JSON ((}) và dấu phẩy (,) được thay thế bằng các dòng mới và thụt lề trong YAML .

  • Dấu ngoặc ([]) và dấu phẩy (,) được thay thế bằng dấu gạch ngang (-) và dòng mới trong YAML .

  • Không giống như JSON , YAML cho phép các bình luận bắt đầu bằng dấu băm (#). Nó là tương đối dễ dàng để chuyển đổi một trong những định dạng khác. Mặc dù được cảnh báo trước, bạn sẽ mất bình luận khi chuyển đổi tài liệu YAML sang JSON .


0

Tôi thấy cả YAML và JSON đều rất hiệu quả. Hai thứ duy nhất thực sự sai khiến khi một thứ được sử dụng cho cái kia đối với tôi là một, thứ mà ngôn ngữ được sử dụng phổ biến nhất. Ví dụ: nếu tôi đang sử dụng Java, Javascript, tôi sẽ sử dụng JSON. Đối với Java, tôi sẽ sử dụng các đối tượng của riêng họ, có khá nhiều JSON nhưng thiếu một số tính năng và chuyển đổi nó thành JSON nếu tôi cần hoặc biến nó thành JSON ở vị trí đầu tiên. Tôi làm điều đó bởi vì đó là một điều phổ biến trong Java và giúp các nhà phát triển Java khác dễ dàng sửa đổi mã của tôi hơn. Điều thứ hai là liệu tôi có đang sử dụng nó cho chương trình để ghi nhớ các thuộc tính hay không, nếu chương trình đang nhận hướng dẫn ở dạng tệp cấu hình, trong trường hợp này tôi sẽ sử dụng YAML, vì nó rất dễ đọc của con người, rất hay tìm cú pháp và rất dễ sửa đổi ngay cả khi bạn không biết làm thế nào YAML hoạt động. Sau đó, chương trình sẽ đọc nó và chuyển đổi nó thành JSON hoặc bất cứ thứ gì được ưa thích cho ngôn ngữ đó.

Cuối cùng, nó thực sự không thành vấn đề. Cả JSON và YAML đều dễ dàng được đọc bởi bất kỳ lập trình viên có kinh nghiệm nào.


-1
  • JSON không thể xử lý dữ liệu lớn so sánh yml

  • Không phù hợp để xử lý các định dạng đa phương tiện khác nhau.

  • JSON không có tính năng hỗ trợ 'bình luận'. Điều này có thể được bao gồm như là một thuộc tính bổ sung một mình.

  • YAML có một số lợi thế so với JSON như tự tham khảo, hỗ trợ cho các kiểu dữ liệu phức tạp, chữ khối được nhúng, nhận xét và hơn thế nữa.

  • JSON chỉ có thể đọc được trong khi YAML có thể đọc được cũng như có thể chỉnh sửa.
  • JSON là một tập hợp con của YAML để các trình phân tích cú pháp YAML có thể phân tích cú pháp JSON.
  • YAML không sử dụng bất kỳ dấu phân cách bổ sung nào, vì vậy nó nhẹ hơn XML và JSON.

Bạn có ý nghĩa gì về các điểm "dữ liệu lớn" và "chỉ có thể đọc được"? JSON là một định dạng dữ liệu, một khái niệm trừu tượng có thể có hai hạn chế này là gì?
João Farias

4
@ JoãoFarias Giả sử bạn có tệp JSON 1GB và tệp CSV 1GB và bạn có 256 MB bộ nhớ. Bạn có thể xử lý từng dòng tệp CSV, với JSON không dễ dàng gì có thể. Việc phân tích từng dòng tệp YAML có lẽ vẫn dễ dàng hơn so với phân tích cú pháp JSON.
NeverEinatingQueue
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.