JSON
module JSON
JavaScript Object Notation (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
Parsing JSON
解析由另一个应用程序接收的或在现有应用程序中生成的JSON字符串:
require 'json'
my_hash = JSON.parse('{"hello": "goodbye"}')
puts my_hash["hello"] => "goodbye"
注意''
散列符号附加的引号。Ruby期望参数是一个字符串,不能像哈希或数组那样转换对象。
Ruby将你的字符串转换成一个散列
Generating 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"
Constants
Infinity JSON_LOADED MinusInfinity NaN UnparserError
如果发生生成器或解析器错误,则会引发此异常。
VERSION
JSON version
Attributes
create_idRW
这是创建标识符,用于确定是否应该调用类的json_create
挂钩。它默认为'json_class'。
dump_default_optionsRW
#dump方法的全局默认选项:
:max_nesting: false
:allow_nan: true
:allow_blank: true
generatorR
返回JSON使用的JSON生成器模块。这是JSON :: Ext :: Generator或JSON :: Pure :: Generator。
load_default_optionsRW
#load方法的全局默认选项:
:max_nesting: false
:allow_nan: true
:allow_blank: true
parserR
返回JSON使用的JSON解析器类。这是JSON :: Ext :: Parser或JSON :: Pure :: Parser。
stateRW
返回JSON使用的JSON生成器状态类。这是JSON :: Ext :: Generator :: State或JSON :: Pure :: Generator :: State。
公共类方法
Show source
如果object
是类字符串,则解析该字符串并将解析结果作为Ruby数据结构返回。否则,从Ruby数据结构对象中生成一个JSON文本并将其返回。
所述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
iconv(to, from, string) Show source
使用Ruby的String.encode对
字符串进行编码
# File ext/json/lib/json/common.rb, line 406
def self.iconv(to, from, string)
string.encode(to, from)
end
restore(source, proc = nil, options = {})
Alias for: load
公共实例方法
dump(obj, anIO = nil, limit = nil) Show source
将obj
转储为JSON字符串,即调用在对象上生成并返回结果。
如果给出了anIO(类IO对象或响应写入方法的对象),则会将生成的JSON写入它。
如果嵌套数组或对象的数量超出限制
,则会引发ArgumentError异常。这个参数与Marshal.dump中的极限
参数相似(但不完全相同!)。
生成器的默认选项可以通过:: dump_default_options方法进行更改。
该方法是Marshal和YAML的加载/转储接口实现的一部分。
# 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
fast_generate(obj, opts = nil) Show source
从Ruby数据结构obj
生成JSON文档并将其返回。这个方法禁止检查Ruby对象中的圆圈。
警告
:小心不要传递任何包含圆圈的Ruby数据结构作为obj
参数,因为这会导致JSON进入无限循环。
# 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
generate(obj, opts = nil) Show source
从 Ruby 数据结构obj
生成JSON文档并将其返回。状态
是*一个JSON :: State对象,
- 或哈希像对象(响应to_hash),
- 通过to_h方法可转换为散列的对象,
用作或配置一个状态对象。
它默认为一个状态对象,它在一行中创建尽可能短的JSON文本,检查循环数据结构并且不允许NaN,Infinity和-Infinity。
一个国家
的散列可以有以下键:
indent
:用于缩进级别的字符串(默认值:''),
空格
:放在后面的字符串,a:或分隔符(默认值:''),
space_before
:放在a:pair分隔符之前的字符串(默认值:''),
object_nl
:放置在JSON对象末尾的字符串(默认值:''),
array_nl
: a string that is put at the end of a JSON array (default: ''),
allow_nan
:如果应该生成NaN,Infinity和-Infinity,则为
true,否则在遇到这些值时抛出异常。该选项默认为false。
- max_nesting:要生成JSON的数据结构中允许的最大嵌套深度。禁用深度检查:max_nesting => false,默认值为100。请参阅#fast_generate以获得最少的健全性检查,并使用#pretty_generate方法为某些默认设置输出漂亮的文件。#ext / json /lib/json/common.rb,第208行def generate(obj,opts = nil)if === opts state,opts = opts,nil else state = SAFE_STATE_PROTOTYPE.dup end if if opts.respond_to?:to_hash opts = opts.to_hash elsif opts.respond_to?:to_h opts = opts.to_h else raise TypeError,“can not convert#{opts.class} into Hash”end state = state.configure(opts)end state.generate(obj)end load(source,proc = nil,来源并返回它。源可以是类字符串对象,类IO对象或响应读取方法的对象。如果proc被赋予,它将被任何嵌套的Ruby对象作为参数在深度优先顺序递归调用。修改可选选项中的默认选项参数。谨记:这种方法是为了从可信的用户输入序列化数据,比如从你自己的数据库服务器或客户端控制下的数据库,允许不受信任的用户将JSON源传递给它是很危险的。解析器的默认选项可以通过:: load_default_options方法进行更改。此方法是Marshal和YAML的加载/转储接口实现的一部分。#file ext / json / lib / json / common.rb,第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 =解析(来源,源代码到一个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
:默认为哈希
array_class
:默认为Array#文件ext / json / lib / json / common.rb,第155行def parse(source,opts
= {})Parser.new(source,opts
).parse end parse!(source,opts
= { })显示源
解析JSON文档源
到一个Ruby数据结构并将其返回。解析方法的重磅版本默认为opts
哈希的更危险的值,因此请确保只解析可信的源
文档。opts
可以有以下键:
- max_nesting:解析的数据结构中允许的最大嵌套深度。启用深度检查:max_nesting => anInteger。解析!方法默认为不进行最大深度检查:如果有人想填满堆栈,这可能很危险。
allow_nan
:如果设置为true,则允许NaN,Infinity和-Infinity藐视RFC 7159来解析解析器。该选项默认为true。
create_additions
:如果设置为false,则即使找到匹配的类和:: create_id,解析器也不会创建添加项。该选项默认为false。
# 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
pretty_generate(obj,opts = nil)显示源文件
从 Ruby 数据结构obj
生成JSON文档并将其返回。返回的文档是通过解压缩返回的文档的更漂亮的形式。
该OPTS
参数可以用来配置发电机。有关更详细的解释,请参阅生成方法。
# 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
recurse_proc(result,&proc)显示源文件
如果解析的数据结构是Array
或Hash,
则递归调用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
私有实例方法
restore(source, proc = nil, options = {})
Alias for: load