Spec-Zone.ru › Ruby 2.6

модуль JSON

JavaScript Object Нотация (JSON)

JSON — это лёгкий формат обмена данными. Его легко читать и писать людям. Также его просто генерируют и парсят машины. JSON полностью независим от языка, что делает его идеальным форматом обмена.

Основан на двух универсально доступных структурах:

1. A collection of name/value pairs. Often referred to as an _object_, hash table, record, struct, keyed list, or associative array.
2. An ordered list of values. More commonly called an _array_, vector, sequence or list.

Чтобы узнать больше о JSON, посетите: json.org

Парсинг JSON

Для парсинга строки JSON, полученной от другого приложения или сгенерированной в вашем приложении:

require 'json'

my_hash = JSON.parse('{"hello": "goodbye"}')
puts my_hash["hello"] => "goodbye"

Обратите внимание на дополнительные кавычки '' вокруг нотации хеша. Ruby ожидает, что аргумент будет строкой и не может преобразовывать объекты, такие как хеш или массив.

Ruby преобразует вашу строку в хеш

Генерация JSON

Создание строки JSON для связи или сериализации также просто.

require 'json'

my_hash = {:hello => "goodbye"}
puts JSON.generate(my_hash) => "{\"hello\":\"goodbye\"}"

Или альтернативный способ:

require 'json'
puts {:hello => "goodbye"}.to_json => "{\"hello\":\"goodbye\"}"

JSON.generate позволяет преобразовывать только объекты или массивы в синтаксис JSON. to_json, однако, принимает многие классы Ruby, даже если он действует только как метод сериализации:

require 'json'

1.to_json => "1"

Константы

Infinity
JSON_LOADED
MinusInfinity
NaN
UnparserError

Это исключение возникает при ошибке генератора или парсера.

VERSION

JSON версия

Атрибуты

create_id[RW]

Это идентификатор создания, который используется для определения, следует ли вызывать метод json_create класса. По умолчанию он равен 'json_class'.

dump_default_options[RW]

Глобальные параметры по умолчанию для метода JSON.dump:

:max_nesting: false
:allow_nan: true
:allow_blank: true
generator[R]

Возвращает модуль генератора JSON, используемый методом JSON. Это либо JSON::Ext::Generator, либо JSON::Pure::Generator.

load_default_options[RW]

Глобальные параметры по умолчанию для метода JSON.load:

:max_nesting: false
:allow_nan: true
:allow_blank: true
parser[R]

Возвращает класс парсера JSON, используемый методом JSON. Это либо JSON::Ext::Parser, либо JSON::Pure::Parser.

state[RW]

Возвращает класс состояния генератора JSON, используемый методом JSON. Это либо JSON::Ext::Generator::State, либо JSON::Pure::Generator::State.

Публичные методы класса

[](object, opts = {}) Показать исходный код
# File ext/json/lib/json/common.rb, line 13
def [](object, opts = {})
  if object.respond_to? :to_str
    JSON.parse(object.to_str, opts)
  else
    JSON.generate(object, opts)
  end
end

Если object — строка, разобрать строку и вернуть результат разбора как структуру данных Ruby. В противном случае сгенерировать строку JSON из объекта структуры данных Ruby и вернуть её.

Аргумент opts передаётся в generate/parse соответственно. См. документацию generate и parse для получения дополнительной информации.

iconv(to, from, string) Показать исходный код
# File ext/json/lib/json/common.rb, line 406
def self.iconv(to, from, string)
  string.encode(to, from)
end

Кодирует строку с помощью String.encode Ruby.

restore(source, proc = nil, options = {})
Псевдоним для: load

Публичные методы экземпляра

dump(obj, anIO = nil, limit = nil) Показать исходный код
# File ext/json/lib/json/common.rb, line 384
def dump(obj, anIO = nil, limit = nil)
  if anIO and limit.nil?
    anIO = anIO.to_io if anIO.respond_to?(:to_io)
    unless anIO.respond_to?(:write)
      limit = anIO
      anIO = nil
    end
  end
  opts = JSON.dump_default_options
  opts = opts.merge(:max_nesting => limit) if limit
  result = generate(obj, opts)
  if anIO
    anIO.write result
    anIO
  else
    result
  end
rescue JSON::NestingError
  raise ArgumentError, "exceed depth limit"
end

Преобразует obj в строку JSON, вызывая метод generate для объекта и возвращая результат.

Если передан объект anIO (объект типа IO или объект, поддерживающий метод write), полученная строка JSON будет записана в него.

Если количество вложенных массивов или объектов превысит limit, будет вызвано исключение ArgumentError. Этот аргумент похож (но не идентичен!) на аргумент limit в методе Marshal.dump.

Значения по умолчанию для генератора можно изменить с помощью метода dump_default_options.

Этот метод является частью реализации интерфейса load/dump для Marshal и YAML.

fast_generate(obj, opts = nil) Показать исходный код
# File ext/json/lib/json/common.rb, line 239
def fast_generate(obj, opts = nil)
  if State === opts
    state, opts = opts, nil
  else
    state = FAST_STATE_PROTOTYPE.dup
  end
  if opts
    if opts.respond_to? :to_hash
      opts = opts.to_hash
    elsif opts.respond_to? :to_h
      opts = opts.to_h
    else
      raise TypeError, "can't convert #{opts.class} into Hash"
    end
    state.configure(opts)
  end
  state.generate(obj)
end

Генерирует документ JSON из структуры данных Ruby obj и возвращает его. Этот метод отключает проверку на циклы в объектах Ruby.

ВНИМАНИЕ: Будьте осторожны, не передавайте структуры данных Ruby с циклами в качестве аргумента obj, так как это может привести к тому, что JSON войдёт в бесконечный цикл.

generate(obj, opts = nil) Показать исходный код
# File ext/json/lib/json/common.rb, line 208
def generate(obj, opts = nil)
  if State === opts
    state, opts = opts, nil
  else
    state = SAFE_STATE_PROTOTYPE.dup
  end
  if opts
    if opts.respond_to? :to_hash
      opts = opts.to_hash
    elsif opts.respond_to? :to_h
      opts = opts.to_h
    else
      raise TypeError, "can't convert #{opts.class} into Hash"
    end
    state = state.configure(opts)
  end
  state.generate(obj)
end

Генерирует документ JSON из структуры данных Ruby obj и возвращает его. state — это:

  • объект JSON::State;

  • или объект типа Hash (который поддерживает метод to_hash);

  • или объект, преобразуемый в хэш с помощью метода to_h;

который используется для создания или настройки объекта State.

По умолчанию используется объект состояния, который создаёт максимально короткий JSON текст в одной строке, проверяет структуры данных на наличие циклов и не позволяет использовать NaN, Infinity и -Infinity.

Хэш state может содержать следующие ключи:

  • indent: строка для отступа (по умолчанию: ''),

  • space: строка, которая добавляется после разделителей : или , (по умолчанию: ''),

  • space_before: строка, которая добавляется перед разделителем : (по умолчанию: ''),

  • object_nl: строка, добавляемая в конце объекта JSON (по умолчанию: ''),

  • array_nl: строка, добавляемая в конце массива JSON (по умолчанию: ''),

  • allow_nan: true, если нужно генерировать NaN, Infinity и -Infinity, иначе, при обнаружении этих значений, генерируется исключение. По умолчанию false.

  • max_nesting: Максимальная глубина вложенности в структурах данных, из которых генерируется JSON. Отключить проверку глубины с помощью :max_nesting => false, по умолчанию 100.

См. также метод fast_generate для самого быстрого метода создания с минимальным количеством проверок и метод pretty_generate для методов с настройками по умолчанию для красивого вывода.

load(source, proc = nil, options = {}) Показать исходный код
# File ext/json/lib/json/common.rb, line 323
def load(source, proc = nil, options = {})
  opts = load_default_options.merge options
  if source.respond_to? :to_str
    source = source.to_str
  elsif source.respond_to? :to_io
    source = source.to_io.read
  elsif source.respond_to?(:read)
    source = source.read
  end
  if opts[:allow_blank] && (source.nil? || source.empty?)
    source = 'null'
  end
  result = parse(source, opts)
  recurse_proc(result, &proc) if proc
  result
end

Загружает структуру данных Ruby из JSON source и возвращает её. source может быть строковым объектом, объектом типа IO или объектом, поддерживающим метод read. Если передан proc, он будет вызываться с любым вложенным объектом Ruby в качестве аргумента рекурсивно в порядке обхода в глубину.

ВНИМАНИЕ: Этот метод предназначен для сериализации данных из надёжных источников, например, из собственного сервера базы данных или клиентов под вашим контролем. Не рекомендуется использовать для данных из ненадежных источников. Значения по умолчанию для парсера можно изменить с помощью метода load_default_options.

Этот метод является частью реализации интерфейса load/dump для Marshal и YAML.

Также алиас для: restore
parse(source, opts = {}) Показать исходный код
# File ext/json/lib/json/common.rb, line 155
def parse(source, opts = {})
  Parser.new(source, opts).parse
end

Парсит документ JSON source в структуру данных Ruby и возвращает её.

opts может содержать следующие ключи:

  • max_nesting: Максимальная глубина вложенности в парсируемых структурах данных. Отключить проверку глубины с помощью :max_nesting => false. По умолчанию 100.

  • allow_nan: Если установлено в true, разрешить NaN, Infinity и -Infinity вопреки RFC 7159 для парсинга парсером. По умолчанию false.

  • symbolize_names: Если установлено в true, возвращает символы для имён (ключей) в объекте JSON. В противном случае возвращаются строки. По умолчанию строки.

  • create_additions: Если установлено в false, парсер не создаёт дополнения, даже если был найден соответствующий класс и create_id. По умолчанию false.

  • object_class: По умолчанию Hash

  • array_class: По умолчанию Array

parse!(source, opts = {}) Показать исходный код
# File ext/json/lib/json/common.rb, line 174
def parse!(source, opts = {})
  opts = {
    :max_nesting  => false,
    :allow_nan    => true
  }.merge(opts)
  Parser.new(source, opts).parse
end

Парсит документ JSON source в структуру данных Ruby и возвращает её. Метод parse! по умолчанию использует более опасные значения для хэша opts, поэтому убедитесь, что парсите только надёжные документы source.

opts может содержать следующие ключи:

  • max_nesting: Максимальная глубина вложенности в парсируемых структурах данных. Включить проверку глубины с помощью :max_nesting => anInteger. Метод parse! по умолчанию не выполняет проверки максимальной глубины: это может быть опасно, если кто-то хочет заполнить стек.

  • allow_nan: Если установлено в true, разрешить NaN, Infinity и -Infinity для парсинга парсером вопреки RFC 7159. По умолчанию true.

  • create_additions: Если установлено в false, парсер не создаёт дополнения, даже если был найден соответствующий класс и create_id. По умолчанию false.

pretty_generate(obj, opts = nil) Показать исходный код
# File ext/json/lib/json/common.rb, line 270
def pretty_generate(obj, opts = nil)
  if State === opts
    state, opts = opts, nil
  else
    state = PRETTY_STATE_PROTOTYPE.dup
  end
  if opts
    if opts.respond_to? :to_hash
      opts = opts.to_hash
    elsif opts.respond_to? :to_h
      opts = opts.to_h
    else
      raise TypeError, "can't convert #{opts.class} into Hash"
    end
    state.configure(opts)
  end
  state.generate(obj)
end

Генерирует документ JSON из структуры данных Ruby obj и возвращает его. Возвращаемый документ — более наглядная форма документа, возвращаемого методом unparse.

Аргумент opts может использоваться для настройки генератора. Подробное объяснение см. в методе generate.

recurse_proc(result, &proc) Показать исходный код
# File ext/json/lib/json/common.rb, line 341
def recurse_proc(result, &proc)
  case result
  when Array
    result.each { |x| recurse_proc x, &proc }
    proc.call result
  when Hash
    result.each { |x, y| recurse_proc x, &proc; recurse_proc y, &proc }
    proc.call result
  else
    proc.call result
  end
end

Рекурсивно вызывает переданный Proc, если парсируемая структура данных является массивом или хэшем.

Приватные методы экземпляра

restore(source, proc = nil, options = {})
Псевдоним для: load

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API