JSON의 여러 줄 문자열


655

JSON 형식으로 일부 데이터 파일을 작성 중이며 실제로 긴 문자열 값을 여러 줄로 나누고 싶습니다. 파이썬의 JSON 모듈을 사용하여 내가 사용 여부, 오류의 전체 많이 얻을 \또는 \n도피.

JSON에 여러 줄 문자열을 사용할 수 있습니까? 그것은 시각적으로 편안함을주는 것이기 때문에 편집기에서 단어 줄 바꿈을 켤 수 있다고 생각하지만 궁금합니다.



1
데이터 구조화 : 여러 줄 문자열을 문자열 배열로 나누고 나중에 결합하십시오.
RubyTuesdayDONO

2
hjson 도구를 사용해보십시오. json의 여러 줄 문자열을 적절한 json 형식으로 변환합니다.
gaurav

답변:


402

JSON 은 실제 줄 바꿈을 허용하지 않습니다. 모든 줄 바꿈을로 바꾸어야합니다 \n.

예 :

"first line second line"

함께 저장할 수 있습니다 :

"first line\nsecond line"

노트 :

를 위해 Python다음과 같이 작성해야합니다.

"first line\\nsecond line"

\\백 슬래시를 피하기위한 곳 , 그렇지 않으면 파이썬은 \n제어 문자 "새 줄"로 취급합니다


88
-1 OP "\ n"이스케이프 시퀀스를 사용하고 있습니다. "\\ n"과 같이 백 슬래시를 이스케이프 처리 하지 않기 때문에 작동하지 않으므로 Python은 이스케이프 시퀀스를 문자 그대로 백 슬래시 뒤에 en으로 남겨 두지 않고 줄 바꿈 문자로 변환합니다 (JSON 필요).
user359996

6
@ user359996 사실인지 잘 모르겠습니다. 저에게 (JSON에 데이터를 저장 \n하고 Curses를 통해 출력하는 경우) \n제대로 작동하는 것 같습니다. 뷰 / 렌더링 엔진에 따라 다릅니다.
ashes999

2
개행 시퀀스는 실제로 플랫폼에 따라 다릅니다 (참조 : en.wikipedia.org/wiki/Newline#Representations ). 그러나 Orbit의 답변에서 @Lightness Races에 따라 커서 반환 문자 나 줄 바꿈 문자는 JSON 문법에 없습니다. 나는 실제로 파이썬 프로그래머가 아니므로 귀하의 경우에 무슨 일이 일어나고 있는지 잘 모르겠지만 파서가 깨 졌거나 귀하가 생각하는 것을 전달하지 못하고 있습니다. 어쩌면이 대답은 더 잘 설명합니다 : stackoverflow.com/a/9295597/359996 . 특히 이중 이스케이프에 대한 내용에 유의하십시오.
user359996

5
@Nawaz : "\ n"및 "\ r"은 각각 줄 바꿈 및 캐리지 리턴을위한 이스케이프 시퀀스 입니다. 리터럴 줄 바꿈 및 캐리지 리턴 제어 문자 가 아닙니다 . 보다 명확하게하기위한 추가 예제 로서, 리터럴 백 슬래시와 달리 "\\"는 백 슬래시 의 이스케이프 시퀀스 입니다. JSON 문법은 제어 문자 ( "char"정의 참조)를 명시 적으로 제외하고 대신 이스케이프 시퀀스 (\\, \ r, \ n 등)를 통해 표시합니다.
user359996

2
@ user359996 : 예 .. 나중에 다른 사람이 같은 의심을 품을 경우를 대비하여 이전의 의견을 계속 지키고 있지만 우리의 토론이 도움이 될 수 있습니다. BTW를 확인해 주셔서 감사합니다.
Nawaz

197

작은 Node.js 프로젝트를 위해이 작업 을 수행해야 했으며이 해결 방법을 찾았습니다 .

{
 "modify_head": [

  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"

 ],
}

이것은 나에게 깔끔하게 보입니다. 어쨌든 큰 따옴표를 사용해야한다는 점에서 아파트. 그렇지 않으면 아마도 YAML을 사용할 수는 있지만 다른 함정이 있으며 기본적으로 지원되지 않습니다. 구문 분석되면 각 문자열 다음에 줄 바꿈을 원하는지 여부에 따라 myData.modify_head.join('\n')또는을 사용 myData.modify_head.join()합니다.


40
이것은 특정 설정에 대한 솔루션이며 반드시 질문과 관련이있는 것은 아닙니다. 여러 줄로 된 문자열은 없지만 (어쨌든 불가능합니다) 내부에 문자열이있는 배열
Samuel Rivas

3
문자열에 줄 바꿈을 삽입하는 방법을 보여 주므로 질문에 대답하지 않습니다. 이 대답 은 그렇습니다.
fgrieu

1
fgrieu-개행을 추가하지 않고도 문자열을 쉽게 연결할 수 있습니다. 작은 변경으로 JSON 스키마 지정을 제어하는 ​​한 여러 줄 문자열에 대한 해결 방법을 제공합니다. 나는 이것으로 대답을 개선하려고 노력할 것입니다.
drrob

1
고마워, 나는 이것을 좋아한다. 나는 내가하고있는 일을 위해 이것을 가지고 가고있다. 깔끔하고 체계적으로 보입니다. 이 배열의 각 줄 바꿈은 출력 텍스트에서 줄 바꿈을 의미하지만 줄 바꿈을 삽입하지 않는 경우 에도이 솔루션을 사용할 수 있습니다. 필자는 자바 스크립트 소스 코드 에서이 솔루션을 사용했으며 모양이 어떻게 구성되어 있고 최종 문자열에 어떤 종류의 공백이 있는지에 대한 의심을 가지지 않기 때문에 사용했습니다.
Gal

JSON 발명자의 예약에도 불구하고, 자바 스크립트 부분을 제외하고 주석을 추가하기 위해 주석을 추가하는 데 사용했습니다. 작은 JSON 파일을 수동으로 편집 할 수있는 미래의 관리자에게 도움이되도록 주석을 추가했습니다.
Whirl Mind

117

불행히도 여기의 많은 답변은 문자열 데이터에 줄 바꿈 문자를 넣는 방법에 대한 질문을 다룹니다. 문제는 문자열 값을 여러 줄의 코드로 분할하여 코드를 더 멋지게 만드는 방법입니다. (그리고 이것을 인식하는 답변조차도 데이터 표현을 자유롭게 변경할 수 있다고 가정하는 "솔루션"을 제공하지만 많은 경우에는 그렇지 않습니다.)

더 나쁜 소식은 정답이 없다는 것입니다.

많은 프로그래밍 언어에서 명시 적으로 줄간에 문자열 나누기를 지원하지 않더라도 문자열 연결을 사용하여 원하는 효과를 얻을 수 있습니다. 컴파일러가 끔찍하지 않으면 괜찮습니다.

그러나 json은 프로그래밍 언어가 아닙니다. 단지 데이터 표현 일뿐입니다. 문자열을 연결하도록 말할 수 없습니다. 그것의 (상당히 작은) 문법에는 여러 줄의 문자열을 나타내는 기능도 포함되지 않습니다.

어떤 종류의 전 처리기 (pre-processor)를 고안하는 것 (그리고이 문제를 해결하기 위해 자신의 언어를 효과적으로 구성하고 싶지 않다)은이 문제에 대한 일반적인 해결책은 없습니다. 데이터 형식을 변경할 수 있으면 문자열 배열을 대체 할 수 있습니다. 그렇지 않으면, 이것은 json이 사람이 읽을 수 있도록 설계되지 않은 수많은 방법 중 하나입니다.


3
OP가 무엇을 원하는지, 문자열의
줄 바꾸기

3
@ 9ilsdx9rvj0lo : 아뇨.
Mark Adelsberger

"질문은 여러 줄의 코드로 문자열 값을 분할하여 코드를 더 멋지게 보이게하는 방법에 관한 것입니다.": 파이썬에서 여러 줄 문장에 대한 솔루션은 stackoverflow.com/questions/53162/…를 참조하십시오 . 여러 줄의 JSON과 여러 줄의 파이썬에는 차이가 있습니다. 여러 줄 JSON은 JSON에서 '\'다음에 'n'을 사용합니다 (예 : 문자열에서 "\ n"). 여러 줄의 파이썬 문장 인 경우 '\'다음에 '\ n'을 사용하십시오. 즉, 계속 될 줄의 후행 백 슬래시. Windows 형식 : 적절한 경우 \ n을 \ r \ n으로 바꾸십시오!
Ivan

106

사양을 확인하십시오 ! JSON 문법의 문자 생성은 다음 값을 가질 수 있습니다.

  • 어떤-유니 코드 문자 except- "- 또는 \- 또는 제어 문자
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 4 자리 숫자

줄 바꿈은 "제어 문자"이므로 아니요, 문자열 내에 리터럴 줄 바꿈이 없을 수 있습니다. 그러나 당신의 어떤 조합을 사용하여 인코딩 할 수 있습니다 \n그리고 \r당신이 필요합니다.



3
모호하지 않기 때문에 정답입니다. 제어 문자로 올바르게 이스케이프 처리되는 한 스펙에 따라 새 행 허용됩니다.
Ryan

JSON의 @AliKhaki \ n은 질문에서 찾은 결과를 달성하지 못합니다. 다른 무언가 (즉, 개행 문자 포함)를 생각하거나 프로그래밍 언어의 문자열 리터럴 (JSON 포함)에서 개행에 대해 이야기하고 있습니다.
궤도에서 가벼움 경주

@LightnessRacesinOrbit 그래, 난 문자열에 줄 바꿈을 찾고
알리 카키

46

JSON은 가독성을 위해 줄 바꿈을 허용하지 않습니다.

가장 좋은 방법은 줄 바꿈 할 IDE를 사용하는 것입니다.


1
"소프트"라인 랩을 지원하는 BBEdit와 같은 편집기가 이상적입니다. 텍스트가 줄 바꿈되어 편집기 창의 보이는 영역 내에 모두 표시되지만 입력 한 줄 끝 (예 : 캐리지 리턴)은 파일을 저장할 때 파일에 유지됩니다. 코드 트릭이나 해킹에 의존하지 않고도 긴 문자열로 JSON을 쉽게 편집 할 수 있습니다.
cshotton

44

이것은 정말 오래된 질문이지만 검색 에서이 문제를 발견했으며 문제의 원인을 알고 있다고 생각합니다.

JSON은 데이터에 "실제"줄 바꿈을 허용하지 않습니다. 줄 바꿈을 벗어날 수 있습니다. @YOU답변 을 참조하십시오 . 질문에 따르면 파이썬에서 줄 바꿈을 이스케이프하려고 시도한 것처럼 보입니다. 줄 연속 문자 ( )를 사용하거나 이스케이프 를 사용 하는 것입니다."\""\n"

그러나 파이썬에서 문자열을 사용하는 경우 특수 이스케이프 문자 ( "\t", "\n")가 REAL 제어 문자로 변환됩니다! 이 "\n"줄 바꿈 문자를 나타내는 ASCII 제어 문자로 바뀝니다. 정확하게 JSON에서 잘못된 문자입니다. (행 연속 문자는 개행을 간단히 제거합니다.)

따라서 파이썬이 문자를 이스케이프하지 못하게해야합니다. 원시 문자열을 사용하여 ( r문자열처럼 문자열 앞에 입력 r"abc\ndef"하거나 줄 바꿈 앞에 추가 슬래시 ( "abc\\ndef") 를 사용하여이를 수행 할 수 있습니다 .

위의 두 가지 모두 "\n"실제 줄 바꿈 ASCII 제어 문자 로 바꾸지 않고 "\n"두 개의 리터럴 문자로 남겨두고 JSON은 줄 바꿈 이스케이프로 해석 할 수 있습니다.


12

속성 값을 문자열 배열로 씁니다. https://gun.io/blog/multi-line-strings-in-json/ 여기에 주어진 예와 같습니다 . 도움이 될 것입니다.

다음과 같이 여러 줄 문자열에 대해 항상 문자열 배열을 사용할 수 있습니다.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

또한 배열을 쉽게 반복하여 콘텐츠를 여러 줄로 표시 할 수 있습니다.


1
링크가 나중에 끊어 질 수 있으므로 링크에서 답변에 정보를 추가하는 것이 좋습니다.
YoungHobbit

5
그러나 그들에게는 문자열이 아닌 배열이 있습니다. 배열은 문자열이 아닙니다. 기간.
9ilsdx 9rvj 0lo

그냥 생각하고 있었어 좋은!
필립 제이콥스


10

JSON에 여러 줄 문자열을 사용할 수 있습니까?

예. 방금 F12 키를 누르고 콘솔을 클릭하고 화면 하단에 입력하여 Firefox 웹 브라우저로 이것을 테스트했습니다.

x={text:"hello\nworld"}

Object x는 여러 줄 문자열을 포함하는 JSON 형식 문자열에서 생성되었습니다.

console.log(x.text)
hello
world

여러 줄 문자열임을 나타내는 x.text가 표시됩니다.

이 두 가지 테스트는 Firefox의 Javascript 인터프리터가 JSON을 만들고 여러 줄 문자열로 사용하는 것을 기쁘게 생각합니다.

자세히 테스트 JSON.stringifyJSON.parse자바 스크립트 인터프리터 보였다는 JSON에 여러 줄 문자열을 포함하는 개체를 변환하고 전혀 문제없이 다시 구문 분석 할 수 있습니다.

과거에는 셰익스피어의 전체 작품을 JSON 객체의 속성으로 저장 한 다음 인터넷을 통해 그대로 전송했습니다.

다음은 세 줄로 입력 된 두 줄 문자열입니다.

x={text:"expert\
s\nex\
change"}

대상을 표시 할 수 있습니다

console.log(x)

기부

Object { text: "experts\nexchange" }

또는 문자열

console.log(x.text)

기부

experts
exchange

문자열의 줄 끝은 \ n을 사용하여 발생하며 여러 입력 줄은 줄 끝에서 \를 사용하여 달성됩니다.

실제로 줄 끝을 문자열의 줄 끝과 동기화하려고 할 수 있습니다.

x={text:"experts\n\
exchange"}

여러 줄 문자열 길이

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

줄 바꿈이있는 문자열은 공백이있는 문자열보다 길지 않습니다. 키보드에 두 문자 ( '\'및 'n')를 입력했지만 문자열에는 한 문자 만 저장됩니다.


3
자바 스크립트 문자열 형식 리더는 일에 발생하면서 그래서, 자바 스크립트 콘솔도 받아, 반대 JSON 문자열 형식 리더와 반대하지 않습니다 x={"a":NaN}x={"a":"a \<literal newline with SHIFT>b"}JSON 아니지만,있는, 자바 스크립트
고양이

9

사용의 모든 항목을 대체하기 위해 정규식 \r\n과를 \\n.

이것은 scala에서 나를 위해 일했습니다.

val newstr = str.replace("\r\n", "\\n")

왜 3 개의 백 슬래시?
neXus

6
@neXus 왜 그런지 모르겠지만 누군가 3 백 슬래시로 편집했습니다. 수정 해 주신 LightnessRacesInOrbit에게 감사드립니다.
Sikander

5

Node.js를 기꺼이 사용하려면 다음을 수행하십시오.

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

Node.js로 가져 와서 다음과 같이 쉽게 JSON으로 변환 할 수 있습니다.

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

그리고 당신은 얻을 :

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

작동 방식 : Node.js를 사용하여 JS 모듈을로드하면 Node.js로 쉽게 JSON으로 묶을 수있는 JS 객체가 생성됩니다. -e 옵션은 문자열을 평가하고이 옵션 -p은 마지막 Node.js 작업의 반환 결과를 stdout으로 에코합니다.

다른 작업 디렉토리에있는 .js 스크립트를로드하려면 ""및 ''문자열을 전환해야합니다.

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`

-4

base64인코딩 된 문자열 값을 사용해보십시오 . 대부분 나를 위해 일했습니다.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

이후 base64같은 인코딩 된 문자열의 모습

{
    "singleLine": "Some singleline String",
    "multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
} 

base64 인코딩 및 디코딩은 모든 언어로 제공됩니다.


7
그것을 표시하려면 특수 코드가 필요합니다. 문자열을 배열로 변환합니다. 해결책이 아님
tom10271

3
나는 이것이 나쁜 생각이라고 생각합니다. 불필요하게 콘텐츠를 모호하게 만들고 그것을 생성하고 소비하기 위해 추가 코드, 시간, 메모리 및 도구가 필요합니다. 문자열을 스캔하고 특수 문자를 바꾸려면 추가 코드, 시간 및 메모리도 필요하지만 base64 인코딩 및 디코딩보다 확실히 적습니다.
Semanino

이것은 JSON의 가독성도 언급 tom10271 @처럼 사라지고 있기 때문에 나쁜 생각, 당신은 JSON 사용하기 위해 추가 작업을 필요
T90

-23

txt 파일에 여러 줄 텍스트를 넣은 다음

var str = {
    text: cat('path_to_file/text.txt')
}

(mongoDB에서 작동합니다)


11
-1 : 오해의 소지가 있습니다. 이름이 지정된 함수가 없으므로 유효한 JSON도 아니고 자바 스크립트에서도 작동하지 않습니다 cat.
Martin Schuhfuß
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.