Jason이 JSON 형식을 지정하도록 지원


11

Jason에는 큰 JSON이 있지만 읽을 수 없으므로이를 확인해야합니다.

포맷팅 사양

JSON에는 4 가지 유형이 있습니다.

  • 번호; 다만0-9
  • 줄; 큰 따옴표로 묶인 "문자열은\
  • 배열; 으로 구분 된 []항목과으로 구분 된 항목 ,은 다음 유형 중 하나 일 수 있습니다.
  • 사물; 로 구분 된 {}형식은 key: valuekey가 문자열이고 value가 이러한 유형 중 하나입니다.

간격

  • 배열은 항목 사이에 쉼표 뒤에 정확히 하나의 공백이 있어야합니다
  • 객체는 키와 값 사이에 공백이 있어야합니다. :

들여 쓰기

  • 각 중첩 수준은 이전보다 2 더 들여 쓰기
  • 각 객체 키 / 값 쌍은 항상 자체 라인에 있습니다. 들여 쓰기
  • 배열에 다른 배열이나 객체가 포함되어 있으면 여러 줄에 걸쳐 들여 쓰기됩니다. 그렇지 않으면 배열은 한 줄로 유지됩니다

규칙

  • 이 작업을 사소한 내장 기능은 허용 되지 않습니다.
  • 항상 표준 허점은 허용되지 않습니다

[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
JSON 구문 분석 기본 제공이 허용됩니까?
PurkkaKoodari

객체 / 배열이 비어있을 수 있습니까? 배열이 여러 줄로 분할되어 있으면 쉼표 뒤에 공백을 인쇄 할 수 있습니까?
Martin Ender

@ MartinBüttner 아니오, 예
Downgoat

@ Pietu1998 hm, 아니오라고 말할 것입니다
Downgoat

언어 파서 언어가 허용됩니까?
Mama Fun Roll

답변:


1

자바 스크립트 (ES6), 368 바이트

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}}`

덜 골프 :

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 + '}';
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.