ruby - 如何将 CSON 解析为 Ruby 对象?
问题描述
我正在尝试将 CSON(CoffeeScript 对象表示法)读入 Ruby。
我正在寻找类似于data = JSON.parse(file)
用于 JSON 文件的东西。
file = File.read(filename)
data = CSON.parse(file) # does not exist - would like to have
我研究过从 Ruby 调用 CoffeeScript 和 JavaScript,但感觉过于复杂,就像重新发明轮子一样。此外,不应执行数据文件中的代码。
如何以简单的方式将 CSON 读入 Ruby 对象?
解决方案
这就是我想出的。对于我正在处理的数据来说已经足够了。主要工作是使用 YAML 解析器 Psych ( https://github.com/ruby/psych ) 完成的。数组、散列和一些多行文本需要特殊处理。
module CSON
def load_file(fname)
load_string File.read fname
end
def remove_indent(data)
out = ""
data.each_line do |line|
out += line.sub /^\s\s/,""
end
out
end
def parse_array(data)
data.gsub! /\n/, ","
data.gsub! /([\[\{]),/, '\1'
data.gsub! /,([\]\}])/, '\1'
YAML.load data
end
def load_string(data)
hashed = {}
data.gsub! /^(\w+):\s+(\[.*?\])/mu do # find arrays
key = Regexp.last_match[1]
value = parse_array Regexp.last_match[2]
hashed[key] = value
""
end
data.gsub! /(\w+):\s+\'\'\'\s*\n(.*?)\'\'\'/mu do # find heredocs
hashed[Regexp.last_match[1]] = remove_indent Regexp.last_match[2]
""
end
hashed.merge YAML.load data
end
end
当应用于更复杂的 .cson 文件时,此解决方案可能会失败。我很乐意看看是否有人有更优雅的答案!
推荐阅读
- python - 计算在 Python 中导致错误的方法数
- php - 子集合操作
- python - 使用 selenium 批量执行 python 脚本(selenium 错误)
- fortran - 返回许多值的索引函数
- python - Flask-Sqlalchemy:具有 3 个主键的表,它们也是外键
- javascript - NodeJS 需要具有不同行为的脚本
- python - 如果在递归结束时堆栈如何展开?
- c - F = (9/5 * C) + 32 和 F = (C *9/5) + 32 有什么区别?优先级?
- python - plt.scatter() 是冗余函数吗?
- c++ - 指针传递后结果的变化