我的项目中有一个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;
}
};
答案 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
关联的值。这将是white
和black
,您可以从这些组合键轻松创建字符串color-white
和color-black
(并找到相关的颜色值)。
这样您就不必更改您可能无法完全控制的YAML文档,并且您不必对字符串"&color-neutral-20 \"#222222\""
进行特殊解析,因为@greuze建议你应该这样做。