【问题标题】:Converting yaml file to json in nodejs在nodejs中将yaml文件转换为json
【发布时间】:2017-04-05 09:21:48
【问题描述】:

我的项目中有一个edit.yml 文件。这是yaml 文件:

color :
  white : &color-white "#FFFFFF"
  black : &color-black "#262626"
neutral :
  20 : &color-neutral-20 "#222222"
  90 : &color-neutral-90 "#EEEEEE"

因此,当我使用node.js 以下代码将其转换为json 时,我没有得到&color-white。那可能是因为它在转换时省略了特殊字符。但我需要它们在我的json

node.js代码:

var fs = require('fs');
const yaml1 = require('js-yaml');
const YAML = require('yamljs');
module.exports = {
  save : function(item) {
    fs.writeFile('edit1.yml',YAML.stringify(item,4),function(err,item){
      if(err) {
      }
    });
  },
  load : function() {
    var data = yaml1.safeLoad(fs.readFileSync('edit0.yml','utf8'));
    var indentedJson = JSON.stringify(data, null, 4);
    return indentedJson;
  }
}; 

【问题讨论】:

    标签: json node.js yaml


    【解决方案1】:

    YAML 模块工作正常,问题出在您的 YAML 上。这是一个有效的文件,但可能不是你想要的。

    让我引用 YAML 规范的一部分:

    重复的节点(对象)首先由一个锚(标记 与符号 - “&”),然后被别名(用 星号 - “*”)之后。

    在您的示例中,color-white 是该节点的别名,可用于 yaml 文件的其余部分。

    如果您需要将 & 符号 (&) 符号后面的文本放在 JSON 文件中,您可以使用 yaml 文件,例如:

    color :
      white : "&color-white \"#FFFFFF\""
      black : "&color-black \"#262626\""
    neutral :
      20 : "&color-neutral-20 \"#222222\""
      90 : "&color-neutral-90 \"#EEEEEE\""
    

    这将返回一个类似的 JSON:

    {
        "color": {
            "white": "&color-white \"#FFFFFF\"",
            "black": "&color-black \"#262626\""
        },
        "neutral": {
            "20": "&color-neutral-20 \"#222222\"",
            "90": "&color-neutral-90 \"#EEEEEE\""
        }
    }
    

    所以json.color.white 将是&color-white "#FFFFFF"

    【讨论】:

    • 非常感谢您的回复。如果我们这样做,那会是一个有效的 Yaml 吗?
    • 是的,当然,值是字符串,包含转义引号,一切正常
    • 一个更简单、更易读的选项是使用反斜杠转义最初的 & 字符:white : \&color-white "#FFFFFF"
    【解决方案2】:

    您文件中的 YAML 是一个包含 anchors 的文档。

    此类锚点通常用于转储直接或间接的自引用结构。但是,您的示例不包含引用这些锚点的别名。

    YAML 规范的重要部分在上面链接的部分中:

    否则,锚名称是一个序列化细节,一旦组合完成就会被丢弃

    因此,不应依赖锚名称在加载后可用,也不应用于传递信息。 YAML 文档中的 cmets 也是如此。

    IMO 您认为您不需要作为锚点&color-white 一部分的字符串color-white。您应该通过键 color 组成该字符串 遍历与color 关联的值的映射键。那将是whiteblack,您可以从这些组合键轻松创建字符串color-whitecolor-black(并找到相关的颜色值)。

    这样您就不必更改您可能无法完全控制的 YAML 文档,也不必像 @greuze 建议的那样对字符串 "&color-neutral-20 \"#222222\"" 进行特殊解析。

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多