Giúp Jason định dạng JSON của mình


11

Jason có một JSON lớn nhưng không thể đọc được, vì vậy anh ta cần phải làm đẹp nó.

Định dạng Spec

JSON có 4 loại khác nhau:

  • Số; Chỉ0-9
  • Dây; "Chuỗi trích dẫn đôi đã thoát với\
  • Mảng; Được giới hạn bởi [], với các mục được phân tách bằng, , các mục có thể là bất kỳ loại nào trong số các loại này
  • Các đối tượng; Được giới hạn bởi {}, định dạng là key: valuenơi khóa là một chuỗi và giá trị là bất kỳ loại nào trong số các loại này

khoảng cách

  • Mảng nên có chính xác một khoảng trắng sau dấu phẩy giữa các mục
  • Các đối tượng chỉ nên có một khoảng trắng giữa khóa và giá trị, sau dấu :

Lõm

  • Mỗi cấp độ lồng được thụt lề 2 lần so với trước
  • Mỗi cặp khóa / giá trị đối tượng luôn nằm trên một dòng riêng. Đối tượng được thụt lề
  • Một mảng được thụt vào trên nhiều dòng nếu nó chứa một mảng hoặc đối tượng khác. Nếu không thì mảng vẫn nằm trên một dòng

Quy tắc

  • Được xây dựng mà tầm thường hóa nhiệm vụ này không phải được phép.
  • Như mọi sơ hở tiêu chuẩn không được phép

Ví dụ

[1,2,3]
[1, 2, 3]
{"a":1,"b":4}
{
  "a": 1,
  "b": 4
}
"foo"
"foo"
56
56
{"a":[{"b":1,"c":"foo"},{"d":[2,3,4,1], "a":["abc","def",{"d":{"f":[3,4]}}]}]}
{
  "a": [
    {
      "b": 1,
      "c": "foo"
    },
    {
      "d": [2, 3, 4, 1],
      "a": [
        "abc",
        "def",
        {
          "d": {
            "f": [3, 4]
          }
        }
      ]
    }
  ]
}
[2,["foo123 ' bar \" baz\\", [1,2,3]]]
[
  2,
  [
    "foo123 ' bar \" baz\\",
    [1, 2, 3]
  ]
]
[1,2,3,"4[4,5]"]
[1, 2, 3, "4[4,5]"]
[1,2,3,{"b":["{\"c\":[2,5,6]}",4,5]}]
[
  1,
  2,
  3,
  {
    "b": ["{\"c\":[2,5,6]}", 4, 5]
  }
]

1
Các phân tích cú pháp JSON được phép?
PurkkaKoodari

Các đối tượng / mảng có thể trống không? Chúng ta vẫn có thể in một khoảng trắng sau dấu phẩy trong mảng nếu chúng phân chia trên nhiều dòng chứ?
Martin Ender

@ MartinBüttner không, và vâng
Downgoat

@ Pietu1998 hm, tôi sẽ nói không
Downgoat

Là ngôn ngữ phân tích cú pháp ngôn ngữ được phép?
Mama Fun Roll

Câu trả lời:


1

JavaScript (ES6), 368 byte

f=(s,r=[],i='',j=i+'  ',a=[])=>s<'['?([,,r[0]]=s.match(s<'0'?/("(?:\\.|[^"])*")(.*)/:/(\d+)(.*)/))[1]:s<'{'?(_=>{for(;s<']';s=r[0])a.push(f(s.slice(1),r,j));r[0]=s.slice(1)})()||/\n/.test(a)?`[
${j+a.join(`,
`+j)}
${i}]`:`[${a.join`, `}]`:(_=>{for(a=[];s<'}';s=r[0])a.push(f(s.slice(1),r,j)+': '+f(r[0].slice(1),r,j));r[0]=s.slice(1)})()||`{
${j+a.join(`,
`+j)}
${i}}`

Ít chơi gôn hơn:

function j(s, r=[], i='') { // default to no indentation
    if (s < '0') { // string
        let a = s.match(/("(?:\\.|[^"])*")(.*)/);
        r[0] = a[2]; // pass the part after the string back to the caller
        return a[1];
    } else if (s < '[') { // number
        let a = s.match(/(\d+)(.*)/);
        r[0] = a[2]; // pass the part after the string back to the caller
        return a[1];
    } else if (s < '{') { // array
        let a = [];
        while (s < ']') { // until we see the end of the array
            s = s.slice(1);
            a.push(j(s, r, i + '  ')); // recurse with increased indentation
            s = r[0]; // retrieve the rest of the string
        }
        r[0] = s.slice(1); // pass the part after the string back to the caller
        if (/\n/.test(a.join())) { // array contained object
            return '[\n  ' + i + a.join(',\n  ' + i) + '\n' + i + ']';
        } else {
            return '[' + a.join(', ') + ']';
        }
    } else { // object
        let a = [];
        while (s < '}') { // until we see the end of the object
            s = s.slice(1);
            let n = j(s, r, i + '  ');
            s = r[0].slice(1);
            let v = j(s, r, i + '  ');
            a.push(n + ': ' + v);
            s = r[0]; // retrieve the rest of the string
        }
        r[0] = s.slice(1); // pass the part after the string back to the caller
        return '{\n  ' + i + a.join(',\n  ' + i) + '\n' + i + '}';
    }
}
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.