支持转储和加载的纯 Javascript YAML 库? [复制]

Posted

技术标签:

【中文标题】支持转储和加载的纯 Javascript YAML 库? [复制]【英文标题】:Pure Javascript YAML library that supports both dump and load? [duplicate] 【发布时间】:2010-09-30 12:17:44 【问题描述】:

YAML(又名YAML)是否存在这种情况?

如果它曾经存在过,它一定已经被抹杀了,因为最近的搜索结果是 nada。看起来有很多实现只能从 javascript 转储到 YAML 输出,但很难找到同时支持转储和加载的实现。

有没有人在做这样的事情......或者需求太低了。

【问题讨论】:

另见:***.com/questions/4335804/javascript-yaml-parser/… 【参考方案1】:

只是在寻找相同的内容,这是Tj Holowaychuk 在refactormycode.com 上写的基本Javascript-based YAML parser。我在这里复制它以确保它不会丢失,看来 yaml.org 上的 JsYaml 链接已经中断了一段时间。还没测试。

;(function()
  YAML = 
    valueOf: function(token) 
      return eval('(' + token + ')')
    ,

    tokenize: function(str) 
      return str.match(/(---|true|false|null|#(.*)|\[(.*?)\]|\(.*?)\|[\w\-]+:|-(.+)|\d+\.\d+|\d+|\n+)/g)
    ,

    strip: function(str) 
      return str.replace(/^\s*|\s*$/, '')
    ,

    parse: function(tokens) 
      var token, list = /^-(.*)/, key = /^([\w\-]+):/, stack = 
      while (token = tokens.shift())
        if (token[0] == '#' || token == '---' || token == "\n") 
          continue
        else if (key.exec(token) && tokens[0] == "\n")
          stack[RegExp.$1] = this.parse(tokens)
        else if (key.exec(token))
          stack[RegExp.$1] = this.valueOf(tokens.shift())
        else if (list.exec(token))
          (stack.constructor == Array ?
            stack : (stack = [])).push(this.strip(RegExp.$1))
      return stack
    ,

    eval: function(str) 
      return this.parse(this.tokenize(str))
    
  
)()

print(YAML.eval(readFile('config.yml')).toSource())




// config.yml

---
  # just a comment
  list: ['foo', 'bar']
  hash:  foo: "bar", n: 1 
  lib:
    - lib/cart.js
    - lib/cart.foo.js
  specs:
    - spec/cart.spec.js
    - spec/cart.foo.spec.js
    # - Commented out
  environments:
    all:
      options:
        failuresOnly: true
        verbose: false

【讨论】:

【参考方案2】:

我更新了这个问题以提供我自己研究过的另一个解决方案:https://github.com/jeremyfa/yaml.js

它是Symfony YAML Component (YAML 1.2) 的纯 javascript 端口,支持加载和转储。希望这会有所帮助。

【讨论】:

其他人无法解析嵌套数组和对象,而您的库可以正常工作。感谢您的开发工作!【参考方案3】:

这里可能是更新版本的 js-yaml:

http://github.com/visionmedia/js-yaml

【讨论】:

我刚试过这个 - 它支持 YAML 的一个子集,这是未记录的。作者告诉我他是为一个特定的项目编写的,无论如何它都不是一个“完整的”解析器。我尝试了 yaml.org 规范中的一些基本 YAML 文档,但失败了。如果你不知道它定义了哪个子集,它就很难使用。 我刚刚发布了我们的 js-yaml(用于 node.js)- PyYAML 解析器的 javascript 端口(发射器将在稍后发布)。您可以使用npm install js-yaml 安装它。或帮助开发:github.com/nodeca/js-yaml【参考方案4】:

我不确定在哪里可以找到支持转储但不加载的“大量实现” - 就 JSON 是 YAML 1.2 的适当子集而言,我想可能有很多,但是子集使得 YAML 对人类不是特别友好,尤其是对于复杂的数据结构。我发现的大多数链接都指向 JS-YAML 的 github 分支,这些分支依赖于 node.js 和/或仅提供解析器。

Jeremy Faivre 在 bitbucket 上的 yaml.js 在独立的 javascript 中实现了 YAML 的转储和加载(我从 answer to a related *** question 中找到了它)。它没有得到积极维护,但似乎适用于中等复杂的 YAML 和/或 javascript 对象。

【讨论】:

【参考方案5】:

yaml-javascript 伪装成转储程序和解析器。没试过。

【讨论】:

不幸的是,该项目似乎并没有过去假装输出转储。不过感谢您的回复。【参考方案6】:

还有这个javascript-yaml-parser/

看到这个问题:JavaScript YAML Parser,Diogo Costa 说:没有可用的 javascript YAML 解析器满足我的需求,所以我开发了自己的:它可以在这里找到: http://code.google.com/p/javascript-yaml-parser/

【讨论】:

以上是关于支持转储和加载的纯 Javascript YAML 库? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

通过 ruamel.yaml 转储时如何在 yaml 文件中保留空值

YAML 将 5e-6 加载为字符串而不是数字

Python - 字典到 YAML 转储 - YAML 不扩展有序字典?

在 PyYAML 中保存/转储带有注释的 YAML 文件

YAML - 转储没有类型/标签的嵌套对象

如何使用显式引用转储 YAML?