使用JSON.parse解析Hash/OpenStruct报错,为何需转为字符串?
为什么JSON.parse不能直接解析Hash或OpenStruct?
第一个问题:为什么JSON.parse({"pong": "ok"})会报错?
嘿,我来帮你理清楚这个问题!你遇到的TypeError: no implicit conversion of Hash into String报错,本质是对JSON.parse的作用搞反啦。
JSON.parse的核心功能是把JSON格式的字符串转换成Ruby对象(比如Hash、Array这类),而不是反过来把Ruby对象转成JSON。你写的{"pong": "ok"}在Ruby环境里会直接被解析成一个Hash对象,根本不是JSON字符串——这就相当于给JSON.parse塞了一个它完全不接受的参数类型,自然会报错。
正确的用法是把JSON格式的字符串传给它,比如用单引号包裹(或者双引号转义内部引号):
JSON.parse('{"pong": "ok"}') # 输出 => {"pong"=>"ok"}
第二个问题:为什么JSON.parse(pong)(OpenStruct实例)也报错?
道理和上面完全一样:JSON.parse只认JSON格式的字符串当输入,而pong是一个OpenStruct实例,属于Ruby的自定义对象,和字符串八竿子打不着,所以才会报“no implicit conversion of OpenStruct into String”的错误。
如果你的需求是把OpenStruct转换成JSON字符串,应该用JSON.generate或者对象自带的to_json方法:
require 'json' require 'ostruct' pong = OpenStruct.new(pong: 'OK') JSON.generate(pong) # 或者直接写 pong.to_json # 输出 => "{\"pong\":\"OK\"}"
要是你之后想把这个JSON字符串再转回Ruby对象,这时候才需要用到JSON.parse:
json_str = pong.to_json JSON.parse(json_str) # 输出 => {"pong"=>"OK"}
内容的提问来源于stack exchange,提问作者belgoros
相关产品推荐
相关产品推荐

