使用内置 Ruby JSON 库反序列化 JSON 原语

2023-12-23

为什么 Ruby 的内置 JSON 不能反序列化简单的 JSON 原语,我该如何解决这个问题?

irb(main):001:0> require 'json'
#=> true

irb(main):002:0> objects = [ {}, [], 42, "", true, nil ]
#=> [{}, [], 42, "", true]

irb(main):012:0> objects.each do |o|
irb(main):013:1*   json = o.to_json
irb(main):014:1>   begin
irb(main):015:2*     p JSON.parse(json)
irb(main):016:2>   rescue Exception => e
irb(main):017:2>     puts "Error parsing #{json.inspect}: #{e}"
irb(main):018:2>   end
irb(main):019:1> end
{}
[]
Error parsing "42": 706: unexpected token at '42'
Error parsing "\"\"": 706: unexpected token at '""'
Error parsing "true": 706: unexpected token at 'true'
Error parsing "null": 706: unexpected token at 'null'
#=> [{}, [], 42, "", true, nil]

irb(main):020:0> RUBY_DESCRIPTION
#=> "ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]"
irb(main):022:0> JSON::VERSION
#=> "1.4.2"

RFC 4627:JavaScript 对象表示法 (JSON) 的 application/json 媒体类型 http://www.ietf.org/rfc/rfc4627.txt有这样说:

2.  JSON Grammar

   A JSON text is a sequence of tokens.  The set of tokens includes six
   structural characters, strings, numbers, and three literal names.

   A JSON text is a serialized object or array.

      JSON-text = object / array

[...]

2.1.  Values

   A JSON value MUST be an object, array, number, or string, or one of
   the following three literal names:

      false null true

如果你打电话to_json在您的六个样本对象上,我们得到:

>> objects = [ {}, [], 42, "", true, nil ]
>> objects.map { |o| puts o.to_json }
{}
[]
42
""
true
null

所以第一个和第二个是有效的JSON 文本而后四个无效JSON 文本即使它们是有效的JSON 值.

JSON.parse http://flori.github.com/json/doc/classes/JSON.html#M000061想要所谓的 JSON 文档:

解析 JSON 文档source转换为 Ruby 数据结构并返回它。

Perhaps JSON文档是图书馆对 RFC 4627 所称的术语JSON 文本。如果是这样,那么引发异常是对无效输入的合理响应。

如果你强行包裹和解开所有东西:

objects.each do |o|
    json = o.to_json 
    begin
        json_text = '[' + json + ']'
        p JSON.parse(json_text)[0]
    rescue Exception => e 
        puts "Error parsing #{json.inspect}: #{e}"    
    end    
end

正如您在评论中指出的那样,使用数组作为包装器比对象更好,以防调用者想要使用:symbolize_names选项。像这样包裹意味着你会一直在吃东西JSON.parseJSON 文本,一切都应该没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内置 Ruby JSON 库反序列化 JSON 原语 的相关文章

随机推荐

  • 反转数组顺序

    我正在尝试反转 java 中数组的顺序 在 O n 内使用最少的内存来完成此操作的最有效方法是什么 不需要用代码回答 伪代码就可以了 这是我的思考过程 create a new temp array I think this is a wa
  • jquery 与更新面板

    我在使用 jquery 上下文菜单和更新面板时遇到问题 我正在使用 htmlTextWriter 在 Customtextbox 控件的 RenderBeginTag 中编写上下文菜单的 javascript 一切正常 我可以右键单击每个文
  • 在 TRichEdit 中加载包含表格但没有表格边框的 RTF 文件

    我有一个 RTF 文件 正在将其加载到 TRichEdit 控件中 我面临的唯一问题是 RTF 文件中有表格 加载相同的文件会显示表格边框 但是当我在 MS Word 中加载相同的 RTF 时 它不显示任何边框 客户端想要相同的行为 有没有
  • raster可以创建不同模式的多层对象吗?

    Can a raster对象 R 中 具有不同模式 数据类型 的层 从表面上看 我们似乎总是被迫选择一种类型 library raster create a SpatialPixelsDataFrame with trivially two
  • 如何在Matlab中删除wav文件的标题

    我需要删除波形文件的前 1024 个字节 我尝试这样做 但我得到了损坏 扭曲的 wavfile wavFile fopen fullFileName r Open file for reading fseek wavFile 1024 1
  • Python 创建带有反馈的迭代器/生成器

    是否可以创建一个迭代器 生成器 它将根据某些值决定下一个值result在上一次迭代中 i e y None for x in some iterator ll y y some calculation on x 我想要选择下一个的逻辑x依赖
  • C# 构造函数线程安全吗?

    假设我有多个线程 每个线程都试图创建同一类的对象 不同线程同时创建同类型的对象会不会互相干扰 我需要在构造函数中使用 锁 吗 这在很大程度上取决于构造函数的实现 如果构造函数仅访问该类的成员 而不访问任何外部静态类或方法 那么是的 它是线程
  • Android BLE BluetoothGatt.writeDescriptor() 有时返回 false

    我正在尝试编写 BLE Android 应用程序 我发现有时当我打电话时BluetoothGatt writeDescriptor https developer android com reference android bluetoot
  • 链接到断开连接的 ADODB.Recordset 的访问表单:保存更改

    我正在尝试设置一个表单以使用断开连接的 ADODB Recordset 作为其源 我遇到的问题是变化是not关闭表单并对提示回答 是 后 将其保存到原始 Access 表中 我缺少什么 注意 请不要告诉我该方法没有用 它只是一个具有本地表的
  • 通用 DbDataReader 到 List 映射

    我的属性绑定数据访问类遇到了一个小问题 更像是烦恼 问题是 当读取器中不存在类中相应属性的列时 映射会失败 Code 这是映射器类 Map our datareader object to a strongly typed list pri
  • 为什么 ORM 被认为是好的,而“select *”被认为是不好的?

    ORM 通常不涉及执行诸如 select 之类的操作吗 如果我有一个表 MyThing 其中包含 A B C D 等列 那么通常会有一个对象 MyThing 其属性为 A B C D 如果该对象没有被如下所示的 select 语句完全实例化
  • 如何在 if 语句中渲染某些内容 React Native

    Problem 我在 React Native 中使用平面列表 并且想要与平面列表中的变量进行比较 如果两个变量相等则渲染一个文本组件 但如果不相等则不渲染任何内容 我尝试了很多方法来做到这一点 但没有任何效果 我希望得到一些帮助来找出一种
  • 在 JsFiddle 中打印 Var

    我如何从 JavaScript 中将某些内容打印到 JsFiddle 的结果屏幕上 我不能使用document write 它也不允许print 我应该用什么 为了能够看到输出console log 在 JSFiddle 中 转到外部资源在
  • sqlite & flex - 如果不存在则插入?

    我正在使用 flex 开发我的第一个桌面应用程序 并且我也是第一次使用 sqlite 我正在创建数据库和所有表 我还想将几行数据添加到几个表中 以便用户在首次安装时可以使用一些数据 我遇到的唯一问题是每次运行程序时它都会一遍又一遍地插入相同
  • 在构造函数中更改扩展的 RichTextBox 文本不起作用

    我有以下课程 public partial class RichTextBoxEx RichTextBox public RichTextBoxEx InitializeComponent Text Some Text 但是 当我将其放在表
  • 使用 R 将数据集中的多列重新排列为一列

    我想将我的一个数据集中的三列合并为一个变量名称为 al anim 的列 并删除所有重复项 将值 动物 ID 从最低到最高排序 然后将每个动物从 1 重新编号到 N变量名称 new id anim1 lt c 1456 2569 5489 1
  • 文件上传需要在 CodeIgniter 中进行验证

    我有 2 个文本字段和 1 个文件上传 这些都是必需的 当我只需要文本字段时 一切正常 但是当我需要上传文件时 验证错误仍然显示需要一个文件 即使我选择了一个文件 我究竟做错了什么 view fieldset fieldset
  • like '%Query%' 与全文搜索 CONTAINS 查询的性能

    我有一个情况 我想搜索单个词 对于这种情况 从性能的角度来看哪个查询会更好 Select Col1 Col2 from Table Where Col1 Like Search or Select Col1 Col2 from Table
  • 如何在 Stacey 应用程序中从逗号分隔的列表值创建链接标签?

    我希望在 Stacey 中为每个项目设置标签 类别 例如 设计 摄影 插图 等 并将每个标签 类别链接到各自的类别 例如 我的project yml 文件内容如下 title Example Person s Logo date Febru
  • 使用内置 Ruby JSON 库反序列化 JSON 原语

    为什么 Ruby 的内置 JSON 不能反序列化简单的 JSON 原语 我该如何解决这个问题 irb main 001 0 gt require json gt true irb main 002 0 gt objects 42 true