gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:01 25 4
gpt4 key购买 nike

为什么 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: The application/json Media Type for JavaScript Object Notation (JSON)有这样说:

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想要它所谓的 JSON 文档:

Parse the JSON document source into a Ruby data structure and return it.

也许 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.parse 提供 JSON 文本,一切都应该没问题。

关于ruby - 使用内置的 Ruby JSON 库反序列化 JSON 原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com