Ruby 2.4

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)显示源文件

如果解析的数据结构是ArrayHash,则递归调用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