модуль 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"
frozen_string_literal: false
Константы
- Бесконечность
- JSON_ЗАГРУЖЕН
- Минус бесконечность
- NaN
- Ошибка разбора
-
Эта исключение возникает, если произошла ошибка генератора или разбора.
- Версия JSON
-
Версия JSON
Атрибуты
Это идентификатор создания, который используется для определения, должен ли вызываться метод json_create класса. По умолчанию он равен 'json_class'.
Глобальные параметры по умолчанию для метода #dump:
:max_nesting: false :allow_nan: true :quirks_mode: true
Возвращает модуль генератора JSON, используемый JSON. Это либо JSON::Ext::Generator, либо JSON::Pure::Generator.
Глобальные параметры по умолчанию для метода #load:
:max_nesting: false :allow_nan: true :quirks_mode: true
Возвращает класс парсера JSON, используемый JSON. Это либо JSON::Ext::Parser, либо JSON::Pure::Parser.
Возвращает класс состояния генератора JSON, используемый JSON. Это либо JSON::Ext::Generator::State, либо JSON::Pure::Generator::State.
Общедоступные методы класса
# 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 передаётся в генератор/парсер соответственно. См. документацию по генерации и разбору.
# File ext/json/lib/json/common.rb, line 430 def self.const_defined_in?(modul, constant) modul.const_defined?(constant) end
# File ext/json/lib/json/common.rb, line 418 def self.iconv(to, from, string) string.encode(to, from) end
Кодирует строку с помощью метода String.encode Ruby
Общедоступные методы экземпляра
# File ext/json/lib/json/common.rb, line 385
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.
# 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.
# 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 для некоторых значений по умолчанию для красивого вывода.
# 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[: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.
# 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 4627 для парсинга парсером. По умолчанию значение false.
-
symbolize_names: Если установлено в true, возвращает символы для имён (ключей) в объекте JSON. В противном случае возвращаются строки. Строки — по умолчанию.
-
create_additions: Если установлено в false, парсер не создаёт добавления, даже если найден соответствующий класс и ::create_id. По умолчанию значение false.
-
object_class: По умолчанию Hash
-
array_class: По умолчанию Array
# File ext/json/lib/json/common.rb, line 174
def parse!(source, opts = {})
opts = {
:max_nesting => false,
:allow_nan => true
}.update(opts)
Parser.new(source, opts).parse
end Парсит документ JSON source в структуру данных Ruby и возвращает её. Версия метода parse с добавлением bang по умолчанию использует более опасные значения для хеша opts, поэтому убедитесь, что вы парсите только надёжные документы source.
opts может содержать следующие ключи:
-
max_nesting: Максимальная глубина вложения, разрешенная в парсируемых структурах данных. Включить проверку глубины с помощью :max_nesting => anInteger. Методы parse! по умолчанию не проверяют максимальную глубину вложения: это может быть опасно, если кто-то пытается заполнить ваш стек.
-
allow_nan: Если установлено в true, разрешить NaN, Infinity и -Infinity вопреки RFC 4627 для парсинга парсером. По умолчанию значение true.
-
create_additions: Если установлено в false, парсер не создаёт добавления, даже если найден соответствующий класс и ::create_id. По умолчанию значение false.
# 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 для более подробного объяснения.
# 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, если парсируемая структура данных является массивом или хешем.
Закрытые методы экземпляра
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.