programing

루비의 JSON 문자열 구문 분석

goodjava 2023. 2. 7. 19:58

루비의 JSON 문자열 구문 분석

루비로 해석하고 싶은 문자열이 있습니다.

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'

데이터를 쉽게 추출할 수 있는 방법이 있나요?

이것은 JavaScript Object Notation(JSON; JavaScript 객체 표기법)과 비슷합니다.일부 변수에 있는 JSON을 구문 분석할 수 있습니다.json_string다음과 같은 경우:

require 'json'
JSON.parse(json_string)

오래된 Ruby를 사용하는 경우 json gem을 설치해야 할 수 있습니다.


또, JSON for Ruby 의 실장은, 몇개의 유스케이스에 보다 적합할 가능성이 있습니다.

해석된 오브젝트에 대해 수행할 작업에 대한 답변을 조금 더 확장합니다.

# JSON Parsing example
require "rubygems" # don't need this if you're Ruby v1.9.3 or higher
require "json"

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
parsed = JSON.parse(string) # returns a hash

p parsed["desc"]["someKey"]
p parsed["main_item"]["stats"]["a"]

# Read JSON from a file, iterate over objects
file = open("shops.json")
json = file.read

parsed = JSON.parse(json)

parsed["shop"].each do |shop|
  p shop["id"]
end

Ruby v1.9.3에서는 JSON을 해석하기 위해 Gems를 설치할 필요가 없습니다.단순히 사용하세요.require 'json':

require 'json'

json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"

Ruby-Doc의 JSON을 참조하십시오.

JSON 스트링 같아요많은 JSON 라이브러리 중 하나를 사용할 수 있으며 다음 작업만 하면 됩니다.

JSON.parse(string)

해시 이외의 오브젝트에 대한 직접 해석을 언급하는 답변은 여기에서는 찾을 수 없습니다.단, object_class 옵션을 사용할 수 있습니다(https://ruby-doc.org/stdlib-2.7.1/libdoc/json/rdoc/JSON.html) 참조).

JSON.parse('{"foo":{"bar": 2}}', object_class: OpenStruct).foo.bar
=> 2

이 옵션을 읽는 더 좋은 방법은 "json 객체가 변하는 루비 클래스"입니다. 이것은 왜 Hash가 기본인지 설명합니다.마찬가지로 json 어레이에는 array_class 옵션이 있습니다.

조금 늦은 감이 있지만 기여할 만한 흥미로운 점을 발견했어요.

실수로 이 코드를 작성했는데 작동되는 것 같습니다.

require 'yaml'
CONFIG_FILE = ENV['CONFIG_FILE'] # path to a JSON config file 
configs = YAML.load_file("#{CONFIG_FILE}")
puts configs['desc']['someKey']

YAML 라이브러리를 사용하고 있기 때문에, 동작하고 있는 것을 보고 놀랐습니다만, 동작하고 있습니다.

그게 중요한 이유는yaml루비에 내장되어 있기 때문에, 보석의 인스톨은 불필요합니다.

버전 1.8.x 및 1.9.x를 사용하고 있기 때문에json라이브러리는 내장되어 있지 않지만 버전 2.x에 있습니다.

엄밀히 말하면 2.0 이전 버전에서 데이터를 추출하는 가장 쉬운 방법입니다.

표준 JSON 라이브러리보다 빠르기 때문에 OJ를 추천합니다.

https://github.com/ohler55/oj

(여기서 퍼포먼스 비교 참조)

OpenStruct가 아닌 자신의 클래스로 역직렬화하려는 경우, 다음을 실현하는 데 많은 작업이 필요하지 않습니다.

require 'json'
# result is an instance of MyClass
result = JSON.parse(some_json_string, object_class: MyClass)

당신이 해야 할 일은 제로 인수 컨스트럭터를 제공하고 구현하기만 하면 됩니다.#[]=어떤 방법JSON.parse가 전화할 겁니다.공개하지 않으려면 비공개로 하면 됩니다.

class MyClass
  attr_reader :a, :b

  private

  def []=(key, value)
    case key
    when 'a' then @a = value
    when 'b' then @b = value
    end
  end
end

irb로 테스트:

> JSON.parse('{"a":1, "b":2}', object_class: MyClass)
=> #<MyClass:0x00007fe00913ae98 @a=1, @b=2>

이 접근법의 경고는 플랫 구조에서만 작동한다는 것입니다.object_class 위해 해야 하는 를 알려 .Hash한 인수(「」를해 주세요.array_classJSON j j j j j j j j j j j j j j j j j j)중첩 구조의 경우 동일한 클래스를 사용하여 모든 레이어를 나타냅니다.

> JSON.parse('{"a":1, "b":{ "a": 32 }}', object_class: MyClass)
=> #<MyClass:0x00007fb5110b2b38 @a=1, @b=#<MyClass:0x00007fb5110b2908 @a=32>>

언급URL : https://stackoverflow.com/questions/5410682/parsing-a-json-string-in-ruby