Spec-Zone.ru › Ruby 2.2

модуль JSON

JavaScript Объект Нотация (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
ОшибкаРазбора

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

Версия

Версия JSON

Атрибуты

create_id[RW]

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

dump_default_options[RW]

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

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

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

load_default_options[RW]

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

:max_nesting: false
:allow_nan: true
:quirks_mode: 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 12
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.

const_defined_in?(modul, constant) Показать исходный код
# File ext/json/lib/json/common.rb, line 429
def self.const_defined_in?(modul, constant)
  modul.const_defined?(constant)
end
iconv(to, from, string) Показать исходный код
# File ext/json/lib/json/common.rb, line 417
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
  limit and opts.update(:max_nesting => 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 238
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 207
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 322
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[:quirks_mode] && (source.nil? || source.empty?)
    source = 'null'
  end
  result = parse(source, opts)
  recurse_proc(result, &proc) if proc
  result
end

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

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

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

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

Также алиас: restore
parse(source, opts = {}) Показать исходный код
# File ext/json/lib/json/common.rb, line 154
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 4627 для анализа парсером. По умолчанию false.

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

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

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

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

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

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

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

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

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

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

pretty_generate(obj, opts = nil) Показать исходный код
# File ext/json/lib/json/common.rb, line 269
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 340
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