модуль 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версия
Атрибуты
Это идентификатор создания, который используется для определения, следует ли вызывать метод json_create класса. По умолчанию он равен 'json_class'.
Глобальные параметры по умолчанию для метода JSON.dump:
:max_nesting: false :allow_nan: true :allow_blank: true
Глобальные параметры по умолчанию для метода JSON.load:
:max_nesting: false :allow_nan: true :allow_blank: true
Публичные методы класса
# 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 для получения дополнительной информации.
# File ext/json/lib/json/common.rb, line 406 def self.iconv(to, from, string) string.encode(to, from) end
Кодирует строку с помощью String.encode Ruby.
Публичные методы экземпляра
# 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.
# 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[: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.
# 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
# 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.
# 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.