Javascript 使用引用属性将JSON转换为YAML

Javascript 使用引用属性将JSON转换为YAML,javascript,json,parsing,yaml,Javascript,Json,Parsing,Yaml,我正在构建一个用于配置YAML文件的web界面,因此需要将YAML解析为JSON并返回YAML。节点模块yaml js在将我的yaml转换为JSON方面做得相当好,但是当我转换回yaml时,文件会变得巨大,并且不是真正的人类可读的,因为副本不会保存为锚和引用。我做错什么了吗 以下是我希望实现的最低版本: const yaml=require(“js yaml”); 常量json={ 常数:{ 人:{ 姓名:“七月”, 身份证号码:2 } }, worldObject:{ 姓名:“七月”, 身份证

我正在构建一个用于配置YAML文件的web界面,因此需要将YAML解析为JSON并返回YAML。节点模块yaml js在将我的yaml转换为JSON方面做得相当好,但是当我转换回yaml时,文件会变得巨大,并且不是真正的人类可读的,因为副本不会保存为锚和引用。我做错什么了吗

以下是我希望实现的最低版本:

const yaml=require(“js yaml”);
常量json={
常数:{
人:{
姓名:“七月”,
身份证号码:2
}
},
worldObject:{
姓名:“七月”,
身份证号码:2
},
worldArray:[
{
姓名:“七月”,
身份证号码:2
},
{
姓名:“七月”,
身份证号码:2
}
]
};
const jsontoyml=async()=>{
const output=yaml.safeDump(json);
控制台日志(输出);
};
jsonToYaml();
预期产量
常数:
个人:&个人
姓名:七月
身份证号码:2
worldObject:*个人
worldArray:
-*人
-*人
备选方案:

万分感谢!
在您的示例中,源JavaScript对象(不是JSON)没有引用的概念。您没有转换带有嵌套引用的JavaScript对象。只要底层JavaScript对象具有引用,就只能使用YAML引用

下面是一个提供预期输出的示例:

const yaml=require(“js yaml”);
const person={
姓名:“七月”,
身份证号码:2
};
常量对象={
常数:{
人:人
},
世界对象:人,
worldArray:[
人,
人
]
};
const jsontoyml=async()=>{
常量输出=yaml.safeDump(obj);
控制台日志(输出);
};
jsonToYaml();
输出
常数:
人员:&ref\u 0
姓名:七月
身份证号码:2
worldObject:*参考0
worldArray:
-*参考0
-*参考0
当严格地从JSON转移到YAML时,您就失去了引用的概念

对于展开的对象,可以为
noRefs
传递
true

const output=yaml.safeDump(obj,{noRefs:true});

一个实际的JSON示例 正如您在下面的示例中所看到的,我使用的是实际的JSON。如上所述,一旦将JSON反序列化为对象,实际上就没有引用了

const yaml=require(“js yaml”);
常数jsonStr=`{
“常数”:{
“人”:{
“姓名”:“七月”,
“id”:2
}
},
“世界对象”:{
“姓名”:“七月”,
“id”:2
},
“worldArray”:[{
“姓名”:“七月”,
“id”:2
}, {
“姓名”:“七月”,
“id”:2
} ]
}`;
const jsontoyml=async()=>{
log(yaml.safeDump(JSON.parse(jsonStr));
};
jsonToYaml();

您可能需要使用另一个包将JSON转换为YAML。请参阅:(
yaml
package)。请参阅:~“此外,还不支持读取隐式块映射键的属性。因此,无法加载以下yaml文档。”谢谢@Mr.polywhill。不过,这种方法似乎产生了同样的结果。仍然没有重复对象的YAML锚。我在这里尝试过:@Mr.polywhill是的,我有点困惑,因为js yaml提供了选项{noRefs:false/true},它似乎关闭了自动引用创建。也许我理解错了,太好了!这就行了!非常感谢您抽出时间!这真干净@很高兴听到这个消息!请记住,JSON!==对象