다음과 같은 파일이 있다고 가정합니다.
{
"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를 사용하면 객체 키 순서가 유지된다는 장점이 있습니다.