유효하지 않은 json에서 후행 쉼표를 제거합니다(유효하게 만들기 위해).

유효하지 않은 json에서 후행 쉼표를 제거합니다(유효하게 만들기 위해).

다음과 같은 파일이 있다고 가정합니다.

{
    "fruit": "Apple",
}

다음 줄에 "}"가 포함된 경우에만 줄 끝의 쉼표를 제거하고 싶습니다. 따라서 출력은 다음과 같습니다.

{
    "fruit": "Apple"
}

그러나 파일이 아래와 같은 경우. 나는 어떤 변화도 만들고 싶지 않습니다. ,s 뒤에 오지 않기 때문에}

{
    "fruit": "Apple",
    "size": "Large",
    "color": "Red"
}

sed가 있으면 무엇이든 좋을 것입니다.

답변1

이 문제가 발생하는 이유는 JSON 형식이 키나 데이터에 표시되지 않는 공백을 신경 쓰지 않기 때문입니다. 그래서,

{ "key": "data" }

동일합니까?

{ "key":
"data"
}

JSON 파일이 "손상될" 가능성을 추가하는 경우

{ "key":
"data", }

데이터를 구문 분석할 때 JSON 형식의 제약 조건을 완화하는 방법을 알고 있는 JSON 구문 분석기 이외의 다른 것을 사용하여 문서를 올바르게 구문 분석하는 것은 매우 어렵습니다.

Perl JSON모듈은 이 작업을 수행하고 결과를 예쁘게 인쇄할 수도 있습니다.

$ cat file.json
{
    "fruit": "Apple",
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
   "fruit" : "Apple"
}

여기에서는 전체 텍스트 문서를 배열로 읽습니다 @text. 그런 다음 구문 분석을 완화하면서 이를 디코딩합니다(이를 통해 JSON 문서에 앞에 쉼표가 있고 }주석 ]도 포함될 수 있음 #). 그런 다음 결과 Perl 데이터 구조를 즉시 JSON으로 다시 인코딩하고 인쇄합니다.

다른 예시:

$ cat file.json
{
    "fruit": "Apple",   # a comment
    "stuff": [1, 2, 3,],
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
   "fruit" : "Apple",
   "stuff" : [
      1,
      2,
      3
   ]
}

예쁜 인쇄가 없습니다.

$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}))' file.json
{"fruit":"Apple","stuff":[1,2,3]}

(출력 끝에 개행 문자가 없습니다)

매우 큰 문서의 경우 모듈의 증분 구문 분석 기능을 사용하고 적절한 변환 스크립트를 작성해야 할 수도 있습니다.

답변2

sed -i.bak ':begin;$!N;s/,\n}/\n}/g;tbegin;P;D' FILE

sed -i.bak= 원본 파일의 백업을 만든 다음 해당 파일에 변경 사항을 적용합니다.

':begin;$!N;s/,\n}/\n}/g;tbegin;P;D'= 모두,이어서새 줄과 }. 제거하다,이전 줄에

FILE= 변경하려는 파일

답변3

사용JSON5Node.js 애플리케이션에서 또는 CLI 유틸리티( npm install --global json5또는집에서 만드는 레시피):

json5 -s 2 file.json

@Kusalananda의 Perl 기반 솔루션과 비교하여 JSON5를 사용하면 객체 키 순서가 유지된다는 장점이 있습니다.

관련 정보