首页 > 解决方案 > 如何将 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 对象?

标签: rubycoffeescript

解决方案


这就是我想出的。对于我正在处理的数据来说已经足够了。主要工作是使用 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 文件时,此解决方案可能会失败。我很乐意看看是否有人有更优雅的答案!


推荐阅读