올바른 형식으로 JSON 파일에 쓰는 방법


111

Ruby에서 해시를 만들고 올바른 형식으로 JSON 파일에 쓰고 싶습니다.

내 코드는 다음과 같습니다.

tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
fJson = File.open("public/temp.json","w")
fJson.write(tempHash)
fJson.close

결과 파일의 내용은 다음과 같습니다.

key_aval_akey_bval_b

Sinatra (버전을 모르겠 음)와 Ruby v 1.8.7을 사용하고 있습니다.

올바른 JSON 형식으로 파일에 어떻게 쓸 수 있습니까?



당신이하는 일은 실제로 제가 사용하는 JSON 및 YAML 구조를 문서화하기 위해 많이 사용하는 것입니다. YAML / JSON을 파일에 저장하는 작은 코드를 작성한 다음 덤프 및 다시로드 전 및 / 또는 후에 데이터가 어떻게 보이는지 보여주는 동일한 구조를 빌드합니다. 따라서 코드가 제대로 작동하지 않더라도 장기적으로 삶을 더 쉽게 만들 수 있으므로이 프로세스를 고수하십시오.
The Tin Man

답변:


177

JSON 라이브러리가 필요하고 to_json.

require 'json'
tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
File.open("public/temp.json","w") do |f|
  f.write(tempHash.to_json)
end

이제 temp.json 파일은 다음과 같습니다.

{"key_a":"val_a","key_b":"val_b"}

3
사소한 개선 : 블록 형식을 제안합니다.File.open(...){ |f| f << h.to_json }
Phrogz 2011 년

18
JSON.pretty_generate(tempHash)is also rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech

94

서식 포함

require 'json'
tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
File.open("public/temp.json","w") do |f|
  f.write(JSON.pretty_generate(tempHash))
end

산출

{
    "key_a":"val_a",
    "key_b":"val_b"
}

1
나는 "a +"옵션을 좋아합니다. 기존 데이터를 방해하지 않습니다.
boulder_ruby 2012-07-20

2
@boulder_ruby 추가는 파일 형식이 JSONlines (한 줄에 하나의 JSON 개체)이고 pretty_generate출력 소비자가 사람이 아닌 한. 와 잘 결합 되지 않는 경우에만 의미가있을 수 있습니다 . 그럼에도 불구하고 JSONlines를 생성 jq하고 출력을 보는 것과 같은 것을 사용하는 것이 좋습니다 .
Sim

11

이 질문은 루비 1.8에 대한 것이지만 인터넷 검색을 할 때 여전히 맨 위에 있습니다.

루비> = 1.9에서는 다음을 사용할 수 있습니다.

File.write("public/temp.json",tempHash.to_json)

다른 답변에서 언급 한 것 외에 루비 1.8에서는 하나의 라이너 양식을 사용할 수도 있습니다.

File.open("public/temp.json","w"){ |f| f.write tempHash.to_json }

3

Ubuntu Linux에서이 작업을 수행하려면 :

  1. Ubuntu 패키지 ruby-json을 설치했습니다.

    apt-get install ruby-json
  2. 나는 대본을 썼다 ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc 포함 :

    ${HOME}/rubybin:${PATH}

(이번에는 bash 명령 줄에 위의 내용도 입력했습니다.)

그런 다음 명령 줄에 입력했을 때 작동했습니다.

jsonDemo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.