programing

JSON 오브젝트에 후행 콤마를 사용할 수 있습니까?

subpage 2023. 3. 20. 23:12
반응형

JSON 오브젝트에 후행 콤마를 사용할 수 있습니까?

JSON 오브젝트 또는 어레이를 수동으로 생성할 경우 오브젝트 또는 어레이의 마지막 항목에 후행 쉼표를 남기는 것이 더 쉽습니다.예를 들어 문자열 배열에서 출력하는 코드는 다음과 같습니다(C++ 의 유사 코드에서는).

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

당신에게 같은 끈을 주는 것

[0,1,2,3,4,5,]

이거 허용되나요?

안타깝게도 JSON 사양에서는 쉼표 후행은 허용되지 않습니다.이를 허용하는 브라우저는 몇 개 있지만 일반적으로 모든 브라우저에 대해 걱정해야 합니다.

일반적으로 문제를 돌려서 실제 값 앞에 콤마를 추가하면 다음과 같은 코드가 나타납니다.

s.append("[");
for (i = 0; i < 5; ++i) {
  if (i) s.append(","); // add the comma only if this isn't the first entry
  s.appendF("\"%d\"", i);
}
s.append("]");

For 루프에 있는 코드 한 줄만 추가해도 비싸지 않아...

제가 어떤 형식의 사전에서 JSON으로 구조체를 출력할 때 사용한 또 다른 대안은 (위에서와 같이) 각 항목 뒤에 항상 쉼표를 추가하고 마지막에 쉼표가 없는 더미 엔트리를 추가하는 것입니다(단, 이것은 단지 게으름일 뿐입니다).

안타깝게도 어레이에서는 잘 작동하지 않습니다.

아니요. JSON 사양은 http://json.org에서 관리되며 쉼표 후행은 허용되지 않습니다.제가 본 바로는 JSON 문자열을 읽을 때 묵묵히 허용하는 파서와 오류를 발생시키는 파서가 있을 수 있습니다.상호 운용성을 위해 포함시키지 마십시오.

위의 코드는 어레이 터미네이터를 추가할 때 후행 쉼표를 삭제하거나 항목 앞에 쉼표를 추가하고 첫 번째 코드는 건너뛰도록 재구성할 수 있습니다.

심플하고, 저렴하고, 읽기 쉽고, 사양에 구애받지 않고 동작합니다.

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

$delim에 대한 중복 할당은 매우 적은 비용입니다.또, 명시적인 루프가 없고, 별개의 코드 fragment가 있는 경우에도 동작합니다.

JavaScript에서는 말미에 쉼표를 사용할 수 있지만 IE에서는 작동하지 않습니다.Douglas Crockford의 버전 없는 JSON 사양은 그들을 허용하지 않았고, 버전 없는 JSON 사양이기 때문에 이것은 변경되어서는 안 된다.ES5 JSON 사양에서는 확장으로 사용할 수 있었지만 Crockford의 RFC 4627에서는 사용할 수 없었기 때문에 ES5는 이를 다시 허용하지 않았습니다.파이어폭스가 그 뒤를 따랐다.Internet Explorer는 우리가 좋은 것을 가질 수 없는 이유입니다.

이미 설명한 바와 같이 (ECMAScript 3에 근거한) JSON 사양에서는 후행 콤마를 사용할 수 없습니다.ES > = 5가 허용되므로 순수 JS에서 실제로 이 표기법을 사용할 수 있습니다.이에 대해 논란이 되고 있으며 일부 파서들은 http://bolinfest.com/essays/json.html,을 지원하지만 (http://json.org/)에서 볼 수 있듯이) JSON에서는 동작하지 않아야 한다는 구체적인 사실입니다.그거에 의하면...

... 왜 아무도 0번째 반복에서 루프를 실제로 분할할 수 있다고 지적하지 않았는지 궁금하군요.루프의 비교 코드 냄새와 실제 퍼포먼스 오버헤드를 없애기 위해 선두 콤마를 사용하는 대신 선두 콤마를 사용하여 실제로는 더 짧은 코드를 만들 수 있습니다.(루프 내에 분기/조건이 없기 때문에) 다른 솔루션보다 심플하고 고속입니다.

예: (OP가 제안하는 코드와 유사한 C 스타일의 의사 코드에서):

s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
    s.appendF("\"%d\"", 0); // 0-th iteration
    for( int i = 1; i < MAX; ++i ) {
        s.appendF(",\"%d\"", i); // i-th iteration
    }
}
s.append("]");

PHP 코더는 innode()를 체크하는 것이 좋습니다.이렇게 하면 어레이가 문자열을 사용하여 결합됩니다.

의사로부터...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone

흥미롭게도 C와 C++(및 C#이라고 생각하지만 확실하지 않음) 모두 다음과 같은 이유로 콤마 후행은 특별히 허용하고 있습니다.이를 통해 프로그래밍 방식으로 목록을 훨씬 쉽게 생성할 수 있습니다.왜 JavaScript가 그들의 선례를 따르지 않았는지 모르겠다.

는 토론 보다는 '토론하다 '토론하다', '토론하다'라는.Defensive Programming 간단한 으로써, 즉, 상호접촉을 간소화할 수 있습니다.

  • json 데이터를 수신하는 앱의 개발자로서, 느긋하게 쉼표를 붙일 수 있습니다.

  • json을 쓰는 을 개발할 때는 엄격하고 다른 답변의 현명한 방법 중 하나를 사용하여 항목 사이에 콤마만 추가하고 말미에 쉼표를 붙이지 않도록 하겠습니다.

해결해야 할 더 큰 문제들이 있다...

JSON5 를 사용합니다.JSON은 사용하지 마세요.

  • 오브젝트 및 어레이에는 후행 콤마를 사용할 수 있습니다.
  • 개체 키가 유효한 식별자일 경우 따옴표로 묶지 않을 수 있습니다.
  • 문자열은 따옴표로 묶을 수 있습니다.
  • 문자열을 여러 줄로 분할할 수 있습니다.
  • 숫자는 16진수(기본값 16)로 할 수 있습니다.
  • 숫자는 소수점(선행 또는 후행)으로 시작하거나 끝날 수 있습니다.
  • 숫자는 Infinity 및 -Infinity를 포함할 수 있습니다.
  • 숫자는 명시적 더하기 기호(+)로 시작할 수 있습니다.
  • 인라인(단행) 댓글과 블록(복행) 댓글 모두 허용됩니다.

http://json5.org/

https://github.com/aseemk/json5

아니요. https://json.org의 '도표'는 스펙을 정확하게 번역한 것으로, 명확하게 하고 있습니다., A보다 value의 일은 ]:

배열용 철도도

★★★★★★★★★★★★★★★★★」}:

물체의 철도도

루프에서 if-branch를 회피하는 방법이 있습니다.

s.append("[ "); // there is a space after the left bracket
for (i = 0; i < 5; ++i) {
  s.appendF("\"%d\",", i); // always add comma
}
s.back() = ']'; // modify last comma (or the space) to right bracket

클래스 JSONArray 사양에 따라 다음 작업을 수행합니다.

  • 닫힘 괄호 바로 앞에 추가 (콤마)가 표시될 수 있습니다.
  • null 값은 , (콤마) 생략이 있을 때 삽입됩니다.

그래서 제가 이해한 바로는 다음과 같이 쓸 수 있어야 합니다.

[0,1,2,3,4,5,]

그러나 일부 파서들이 예상된 6이 아닌 항목 수(Daniel Earwicker가 지적한 IE8 등)로 7을 반환할 수 있습니다.


편집 완료:

JSON Validator는 RFC 4627(JavaScript Object Notation용 응용 프로그램/json 미디어 유형) 및 JavaScript 언어 사양에 대해 JSON 문자열을 검증합니다.여기서 말미에 쉼표가 붙은 배열은 JavaScript에서만 유효하며 RFC 4627 사양에서는 유효하지 않습니다.

단, RFC 4627 사양에는 다음과 같이 기술되어 있습니다.

2.3. 어레이

배열 구조는 0 이상의 값(또는 요소)을 둘러싼 대괄호로 표시됩니다.요소는 쉼표로 구분됩니다.

array = begin-array [ value *( value-separator value ) ] end-array

나에게 이것은 다시 해석의 문제이다.요소가 쉼표로 구분되어 있다고 쓰면(마지막 요소와 같은 특수한 케이스에 대해 기술하지 않고) 두 가지 방법으로 이해할 수 있습니다.

P.S. RFC 4627은 (명시대로) 표준이 아니며 RFC 7159(제안된 표준) RFC 7159에 의해 이미 폐지되었습니다.

권장되지는 않지만 이러한 방법으로 구문 분석할 수 있습니다.

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)

Relaxed JSON에서는 후행 콤마를 사용할 수도 있고 쉼표를 생략할 수도 있습니다.옵션입니다.

JSON과 같은 문서를 해석하기 위해 콤마를 사용할 필요는 없습니다.

Lazed JSON 스펙을 보면 오리지널 JSON 스펙의 '시끌벅적'함을 알 수 있습니다.쉼표와 따옴표가 너무 많습니다...

http://www.relaxedjson.org

이 온라인 RJSON 파서를 사용하여 예를 시험해보고 올바르게 해석되는 것을 확인할 수도 있습니다.

http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D

말했듯이 그것은 허용되지 않는다.그러나 JavaScript에서는 다음과 같습니다.

var a = Array()
for(let i=1; i<=5; i++) {
    a.push(i)
}
var s = "[" + a.join(",") + "]"

(Firefox, Chrome, Edge, IE11에서는 정상적으로 동작하며 IE9, 8, 7, 5에서는 사용할 수 없습니다.)

과거의 경험으로 볼 때 브라우저마다 JSON의 후행 콤마를 다르게 취급하는 것을 알 수 있습니다.

Firefox와 Chrome 둘 다 잘 처리합니다.하지만 IE(모든 버전)가 고장난 것 같습니다.내 말은, 대본의 나머지 부분을 그만 읽고 깨라는 거야.

이 점을 염두에 두고, 또한 항상 호환 코드를 쓰는 것이 좋다는 사실도 염두에 두고, 쉼표 뒤에 쉼표가 없는 것을 확인하는 데 많은 노력을 들일 것을 권장합니다.

:)

현재 카운트를 유지하여 총 카운트와 비교합니다.현재 카운트가 총 카운트보다 작을 경우 쉼표가 표시됩니다.

JSON 생성을 실행하기 전에 합계 카운트가 없으면 작동하지 않을 수 있습니다.

PHP 5.2.0 이상을 사용하는 경우 내장된 JSON API를 사용하여 응답을 포맷할 수 있습니다.

for-loop은 어레이 또는 유사한 반복 가능한 데이터 구조에서 반복하기 위해 사용되므로 다음과 같이 어레이 길이를 사용할 수 있습니다.

awk -v header="FirstName,LastName,DOB" '
  BEGIN {
    FS = ",";
    print("[");
    columns = split(header, column_names, ",");
  }
  { print("  {");
    for (i = 1; i < columns; i++) {
      printf("    \"%s\":\"%s\",\n", column_names[i], $(i));
    }
    printf("    \"%s\":\"%s\"\n", column_names[i], $(i));
    print("  }");
  }
  END { print("]"); } ' datafile.txt

데이터 파일 포함.txt 포함,

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
String l = "[" + List<int>.generate(5, (i) => i + 1).join(",") + "]";

json에는 후행 쉼표를 사용할 수 없습니다.외부 수신자를 위한 것이 아니라 자신의 프로젝트를 위해 쓸 수 있는 솔루션으로는 수신측 후행 콤마를 json 파서에 보내기 전에 제거(또는 공백으로 대체)하는 것이 좋습니다.가장 바깥쪽 json 객체의 말미에 있는 쉼표에 대해 이 작업을 수행합니다.편리한 점은 마지막에 오브젝트를 추가하면 두 번째 마지막 오브젝트에 콤마를 추가할 필요가 없다는 것입니다.또한 컨피규레이션파일이 버전컨트롤 시스템에 있는 경우 실제로 추가한 항목의 행만 표시되므로 더 깔끔한 차이를 만들 수 있습니다.

    char* str = readFile("myConfig.json");
    char* chr = strrchr(str, '}') - 1;
    int i = 0;
    while( chr[i] == ' ' || chr[i] == '\n' ){
        i--;
    }
    if( chr[i] == ',' ) chr[i] = ' ';
    JsonParser parser;
    parser.parse(str);

보통 어레이를 루프하고 문자열의 각 엔트리 뒤에 쉼표를 붙입니다.루프 후 마지막 쉼표를 다시 삭제합니다.

최선의 방법은 아닐지 몰라도 매번 루프의 마지막 물체인지 확인하는 것보다 비용이 적게 듭니다.

언급URL : https://stackoverflow.com/questions/201782/can-you-use-a-trailing-comma-in-a-json-object

반응형