programing

Ruby JSON 구문 분석 변경 해시 키

skycolor 2023. 3. 18. 08:25
반응형

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 형식의 키 값 쌍을 기호가 키로 있는 루비 해시로 변환하는 가장 좋은 방법은 무엇입니까?

액티브 서포트:JSON 디코딩 해시 손실 기호

또는 HashWithIndifferentialAccess일 수 있습니다.

비슷한 문제를 해결하려면 with_indifferent_access 메서드를 호출해야 합니다.

여기 json 문자열이 있는데 변수 s에 할당할 수 있습니다.

s = "{\"foo\":{\"bar\":\"cool\"}}"

이제 JSON 클래스로 데이터를 해석하여 h에 할당할 수 있습니다.

h = JSON.parse(s).with_indifferent_access

그러면 문자열 또는 기호를 키로 사용할 수 있는 해시가 생성됩니다.

h[:foo]["bar"]
  #=> "cool"
  1. ActiveSupport 사용:JSON.decode를 사용하면 JSON 파서를 쉽게 교환할 수 있습니다.
  2. 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.decodeMultiJMultiJ 를 받지 되었습니다 JSON MultiJSON되었습니다.손오공

이를 처리하기 위해 symbol_keys를 사용할 수 있습니다.경고:이 기능은 해시로 해석된 JSON 문자열에서만 작동합니다.

ActiveSupport::JSON.decode(str_json).symbolize_keys

언급URL : https://stackoverflow.com/questions/7543779/ruby-json-parse-changes-hash-keys

반응형