首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JSON

JSON 是一种轻量级的数据交换格式。我们人类很容易读写。另外,机器生成或解析也很简单。JSON 完全是语言不可知的,使其成为理想的交换格式。

建立在两个普遍可用的结构上:

代码语言:javascript
复制
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字符串:

代码语言:javascript
复制
require 'json'

my_hash = JSON.parse('{"hello": "goodbye"}')
puts my_hash["hello"] => "goodbye"

注意''散列符号附加的引号。Ruby期望参数是一个字符串,不能像哈希或数组那样转换对象。

Ruby将你的字符串转换成一个散列

Generating JSON

为通信或序列化创建一个 JSON 字符串就如此简单。

代码语言:javascript
复制
require 'json'

my_hash = {:hello => "goodbye"}
puts JSON.generate(my_hash) => "{\"hello\":\"goodbye\"}"

或者另一种方式:

代码语言:javascript
复制
require 'json'
puts {:hello => "goodbye"}.to_json => "{\"hello\":\"goodbye\"}"

JSON.generate只允许将对象或数组转换为JSON语法。to_json然而,尽管它只作为序列化的一种方法,但它接受许多Ruby类:

代码语言:javascript
复制
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方法的全局默认选项:

代码语言:javascript
复制
:max_nesting: false
:allow_nan: true
:allow_blank: true

generatorR

返回JSON使用的JSON生成器模块。这是JSON :: Ext :: Generator或JSON :: Pure :: Generator。

load_default_optionsRW

#load方法的全局默认选项:

代码语言:javascript
复制
: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参数穿过以产生/解析分别。请参阅生成和解析文档。

代码语言:javascript
复制
# 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对字符串进行编码

代码语言:javascript
复制
# 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的加载/转储接口实现的一部分。

代码语言:javascript
复制
# 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进入无限循环。

代码语言:javascript
复制
# 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。
代码语言:javascript
复制
# 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参数可以用来配置发电机。有关更详细的解释,请参阅生成方法。

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com