YAML tương đương với mảng các đối tượng trong JSON


191

Tôi có một mảng JSON các đối tượng mà tôi đang cố gắng chuyển đổi sang YAML.

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

Có một đại diện tương đương trong YAML không chỉ là JSON không? Tôi muốn làm một cái gì đó như

AAPL:
  - :
    shares: -75.088
    date: 11/27/2015
  - :
    shares: 75.088
    date: 11/26/2015

nhưng điều sạch nhất tôi nghĩ ra là

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }

Câu trả lời:


364

TL; DR

Bạn muốn điều này:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

Ánh xạ

Tương đương YAML của một đối tượng JSON là một ánh xạ, trông giống như sau:

# flow style
{ foo: 1, bar: 2 }
# block style
foo: 1
bar: 2

Lưu ý rằng các ký tự đầu tiên của các phím trong ánh xạ khối phải nằm trong cùng một cột. Để lam sang tỏ:

# OK
   foo: 1
   bar: 2
# Parse error
   foo: 1
    bar: 2

Trình tự

Tương đương với một mảng JSON trong YAML là một chuỗi, trông giống như một trong hai mảng này (tương đương):

# flow style
[ foo bar, baz ]
# block style
- foo bar
- baz

Trong một chuỗi khối, -s phải nằm trong cùng một cột.

JSON sang YAML

Hãy biến JSON của bạn thành YAML. Đây là JSON của bạn:

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

Như một điểm yếu, YAML là một siêu bộ JSON, vì vậy, trên đây đã là YAML hợp lệ nhưng thực sự hãy sử dụng các tính năng của YAML để làm cho nó đẹp hơn.

Bắt đầu từ trong ra ngoài, chúng ta có các đối tượng trông như thế này:

{
  "shares": -75.088,
  "date": "11/27/2015"
}

Ánh xạ YAML tương đương là:

shares: -75.088
date: 11/27/2015

Chúng tôi có hai trong số này trong một mảng (trình tự):

- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015

Lưu ý cách -xếp hàng s và các ký tự đầu tiên của các phím ánh xạ xếp thành hàng.

Cuối cùng, chuỗi này tự nó là một giá trị trong ánh xạ với khóa AAPL:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

Phân tích cú pháp này và chuyển đổi nó trở lại JSON mang lại kết quả như mong đợi:

{
  "AAPL": [
    {
      "date": "11/27/2015", 
      "shares": -75.088
    }, 
    {
      "date": "11/26/2015", 
      "shares": 75.088
    }
  ]
}

Bạn có thể thấy nó (và chỉnh sửa nó một cách tương tác) ở đây .


Tôi đã cập nhật câu hỏi của mình để phản ánh rằng có nhiều mục trong danh sách chứa các cặp chia sẻ và ngày.
wegry

3
@wegry: Không tạo ra sự khác biệt. Xem thêm ví dụ từ trang web YAML: yaml.org/start.html .
Felix Kling

5

Câu trả lời tuyệt vời ở trên. Một cách khác là sử dụng công cụ bao bọc yaml jq tuyệt vời, yq tại https://github.com/kislyuk/yq

Lưu ví dụ JSON của bạn vào một tệp, nói ex.json và sau đó

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
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.