Ruby JSON 구문 분석 변경 해시 키
예를 들어 다음과 같은 해시가 있다고 합시다.
{
:info => [
{
:from => "Ryan Bates",
:message => "sup bra",
:time => "04:35 AM"
}
]
}
다음을 수행하여 정보 어레이를 호출할 수 있습니다.hash[:info]
.
이것을 JSON(JSON.generate)으로 변환해 해석하면(JSON.parse) 다음과 같은 해시가 표시됩니다.
{
"info" => [
{
"from" => "Ryan Bates",
"message" => "sup bra",
"time" => "04:35 AM"
}
]
}
이제 내가 사용한다면hash[:info]
그것은 되돌아온다nil
를 사용하면 안 됩니다.hash["info"]
.
왜 이러한가?그리고 이 비호환성을 수정할 수 있는 방법이 있습니까(처음부터 문자열 키를 사용하는 것 이외)?
JSON은 기호를 지원하지 않기 때문에 JSON 생성기는 기호를 문자열로 변환합니다.JSON 키는 모두 문자열이므로 JSON 문서를 구문 분석하면 기본적으로 문자열 키가 포함된 루비 해시가 생성됩니다.
를 사용하여 문자열 대신 기호를 사용하도록 파서에 지시할 수 있습니다.symbolize_names
선택.
예:
original_hash = {:info => [{:from => "Ryan Bates", :message => "sup bra", :time => "04:35 AM"}]}
serialized = JSON.generate(original_hash)
new_hash = JSON.parse(serialized, {:symbolize_names => true})
new_hash[:info]
#=> [{:from=>"Ryan Bates", :message=>"sup bra", :time=>"04:35 AM"}]
참고 자료: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#method-i-parse
간단히 말해서, 아니다.이렇게 생각해 보면 JSON에 기호를 저장하는 것은 문자열을 JSON에 저장하는 것과 같습니다.따라서 JSON 문자열의 해석에 관해서는 이 둘을 구별할 수 없습니다.물론 문자열 키를 기호로 다시 변환할 수도 있고 JSON과 상호작용하는 클래스를 만들 수도 있습니다. JSON은 자동으로 이 기능을 수행합니다.단, 문자열만 사용하는 것이 좋습니다.
다만, 지금까지의 질문에 대한 회답은 다음과 같습니다.
json 형식의 키 값 쌍을 기호가 키로 있는 루비 해시로 변환하는 가장 좋은 방법은 무엇입니까?
또는 HashWithIndifferentialAccess일 수 있습니다.
비슷한 문제를 해결하려면 with_indifferent_access 메서드를 호출해야 합니다.
여기 json 문자열이 있는데 변수 s에 할당할 수 있습니다.
s = "{\"foo\":{\"bar\":\"cool\"}}"
이제 JSON 클래스로 데이터를 해석하여 h에 할당할 수 있습니다.
h = JSON.parse(s).with_indifferent_access
그러면 문자열 또는 기호를 키로 사용할 수 있는 해시가 생성됩니다.
h[:foo]["bar"]
#=> "cool"
- ActiveSupport 사용:JSON.decode를 사용하면 JSON 파서를 쉽게 교환할 수 있습니다.
- ActiveSupport 사용:JSON.decode(my_json, symbolic_names: true)
이것은 해시 내의 모든 키를 재귀적으로 상징합니다.
(ruby 2.0에 추가)
해시 내의 모든 키를 수정하여 문자열에서 기호로 변환할 수 있습니다.
symbol_hash = Hash[obj.map{ |k,v| [k.to_sym, v] }]
puts symbol_hash[:info]
# => {"from"=>"Ryan Bates", "message"=>"sup bra", "time"=>"04:35 AM"}
안타깝게도 어레이 내에 중첩된 해시에는 작동하지 않습니다.단, 모든 해시 키를 변환하는 약간의 재귀 메서드를 작성할 수 있습니다.
def symbolize_keys(obj)
#puts obj.class # Useful for debugging
return obj.collect { |a| symbolize_keys(a) } if obj.is_a?(Array)
return obj unless obj.is_a?(Hash)
return Hash[obj.map{ |k,v| [k.to_sym, symbolize_keys(v)] }]
end
symbol_hash = symbolize_keys(hash)
puts symbol_hash[:info]
# => {:from=>"Ryan Bates", :message=>"sup bra", :time=>"04:35 AM"}
이 옵션을 이렇게 사용할 수 없습니다.
ActiveSupport::JSON.decode(str_json, symbolize_names: true)
.1에서는 Rails 4.1의
ActiveSupport::JSON.decode
MultiJMultiJ 를 받지 되었습니다 JSON MultiJSON은 되었습니다.손오공
이를 처리하기 위해 symbol_keys를 사용할 수 있습니다.경고:이 기능은 해시로 해석된 JSON 문자열에서만 작동합니다.
ActiveSupport::JSON.decode(str_json).symbolize_keys
언급URL : https://stackoverflow.com/questions/7543779/ruby-json-parse-changes-hash-keys
'programing' 카테고리의 다른 글
Ajax 요청: 안전하지 않은 헤더 설정을 거부했습니다. (0) | 2023.03.18 |
---|---|
webpack dev 서버 CORS 문제 (0) | 2023.03.18 |
MongoDB/NoSQL: 문서 변경 기록 보관 (0) | 2023.03.18 |
단일 페이지 워드프레스를 나뭇가지로 렌더링하는 방법 (0) | 2023.03.18 |
Angular에 사용자 지정 유효성 검사를 추가하는 방법JS폼? (0) | 2023.03.18 |