首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将CSON解析为Ruby对象?

如何将CSON解析为Ruby对象?
EN

Stack Overflow用户
提问于 2018-04-27 18:30:28
回答 1查看 231关注 0票数 0

我正在尝试将CSON (CoffeeScript Object Notation)读入Ruby.

我正在寻找类似于data = JSON.parse(file)的东西,一个将用于JSON文件。

代码语言:javascript
复制
file = File.read(filename)
data = CSON.parse(file)        # does not exist - would like to have

我研究了从Ruby中调用CoffeeScript和JavaScript,但感觉太复杂了,就像重新发明了轮子一样。此外,不应执行数据文件中的代码。

如何以简单的方式将CSON数据读入Ruby对象?

EN

回答 1

Stack Overflow用户

发布于 2018-04-29 03:10:18

这就是我想出来的。对于我正在处理的数据来说,这是足够的。主要工作是使用YAML parser Psych (https://github.com/ruby/psych)完成的。数组、散列和一些多行文本需要特殊处理。

代码语言:javascript
复制
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文件时,此解决方案可能会失败。如果有人有更优雅的答案,我会很高兴的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50060474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档