我试图从json对象获取特定属性。这是我的代码。
require 'json'
def print_f(json)
json.map do |person|
puts "\n#{person['name'] }, \n #{person['lastname']}"
end.join
end
a = '{"JSON": {"name": "Fernando", "lastname": "Soto"}}'
obj = JSON.parse(a)['JSON']
text = ''
text += print_f(obj)
puts text
当我做:
puts obj.inspect
它返回:
"`{"name"=>"Fernando", "lastname"=>"Soto"}"
但是当我尝试运行它时,它会抛出一个错误:
Traceback (most recent call last):
5: from t.rb:14:in `<main>'
4: from t.rb:4:in `print_f'
3: from t.rb:4:in `map'
2: from t.rb:4:in `each'
1: from t.rb:5:in `block in print_f'
t.rb:5:in `[]': no implicit conversion of String into Integer (TypeError)
希望您能够帮助我。
由于您只访问单个记录,因此map
不相关:
def print_f(json)
puts "\n#{person['name'] }, \n #{person['lastname']}"
end
如果您确实要迭代它们,那么您需要将文档更改为:
a = '{"JSON": [ {"name": "Fernando", "lastname": "Soto"}} ]'
这是一个对象数组(哈希),所以map
然后适用。
我注意到的另一件事是,如果你打算返回一个字符串puts
是错误的方法。相反,你想要:
def print_f(json)
"\n#{person['name'] }, \n #{person['lastname']}"
end
这是因为无论输入如何,puts
总是返回nil
。
这就是它的工作原理,以防其他人需要这个具体的例子,希望你发现这个例子很有用。特别感谢tadman。
require 'json'
def print_f(json)
json
json.map do |person|
"\n#{person['name'] },\n #{person['lastname']}\n#{person['name2'] },\n #{person['lastname2']}"
end.join
end
a = '{"key1": [{"name": "Fernando", "lastname": "Soto" ,"name2": "Luis", "lastname2": "Bautista"}]}'
obj = JSON.parse(a)['key1']
text = ''
text += print_f(obj)
print text
这就是结果。
Fernando,
Soto
Luis,
Bautista