在nodejs

时间:2017-04-05 09:21:48

标签: json node.js yaml

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

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

因此,当我使用json以下代码将其转换为node.js时,我没有获得&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;
  }
}; 

2 个答案:

答案 0 :(得分:2)

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"

答案 1 :(得分:0)

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

这种锚通常用于倾倒直接或间接的自参考结构。但是,您的示例不包含引用这些锚点的别名。

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

  

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

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

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

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