Ruby如何不使用gsub解析包含嵌套JSON字符串的对象
Ruby嵌套JSON字符串解析方案
无需使用gsub替换引号,直接借助Ruby标准库json做二次解析即可实现需求,操作如下:
前置准备
首先引入Ruby自带的JSON解析库,无需安装额外依赖:
require 'json'
单字段场景处理(匹配示例数据)
针对你提供的示例数据,处理流程代码如下:
# 假设你拿到的原始JSON字符串如下 raw_json = '{"Name":"{\"FirstName\":\"Douglas\",\"LastName\":\"Crockford\"}"}' # 第一步:解析外层JSON得到第一层结构 outer_obj = JSON.parse(raw_json, symbolize_names: true) # 第二步:单独解析Name字段对应的嵌套JSON字符串 outer_obj[:Name] = JSON.parse(outer_obj[:Name], symbolize_names: true) # 此时outer_obj已得到目标结构:{:Name=>{:FirstName=>"Douglas", :LastName=>"Crockford"}}
多字段/嵌套层级不确定场景的通用处理
如果存在多个字段都是嵌套JSON字符串,或嵌套层级不固定,可以用递归方法做自动处理:
def parse_nested_json(obj) case obj when Hash obj.transform_values { |val| parse_nested_json(val) } when Array obj.map { |val| parse_nested_json(val) } when String begin parsed_val = JSON.parse(obj, symbolize_names: true) # 仅当解析结果为Hash/Array时返回解析值,避免纯数字、普通字符串被误转换 parsed_val.is_a?(Hash) || parsed_val.is_a?(Array) ? parsed_val : obj rescue JSON::ParserError # 不是合法JSON的字符串直接返回原值 obj end else obj end end # 调用方法:直接传入外层解析后的对象即可 final_obj = parse_nested_json(JSON.parse(raw_json, symbolize_names: true))
说明
- 所有转义字符的处理逻辑都由标准JSON库实现,比手动替换引号的方案兼容性更高,不会出现边界场景的解析错误。
- 参数
symbolize_names: true可按需选择,不加时解析出的键为字符串类型,加后为Symbol类型,匹配你给出的目标结构格式。
内容的提问来源于stack exchange,提问作者Sachal
相关产品推荐
相关产品推荐

