我是Javascript的新手,所以如果这个问题很容易,请不要大笑。
我必须将JSON对象解析为YAML&之后使用新编辑的YAML(用户将给我们),将其解析为JSON对象
我选择yaml.js& json2yaml.js由同一作者撰写。
当我从JSON对象解析为YAML时,麻烦就是一切都很好。
例如,json2yaml.js在解析后给我的是:
d3.arc();
但是当我使用yaml.js将其解析为JSON时,我得到的错误无法解析yaml文件。我认为这是因为错误生成yaml功能,但不知道如何使用它。
有没有人正视这个,你知道任何解决方案吗???
======
[更新]提供我用来解析的代码片段
从JSON到YAML
---
state:
id: 0
name: "CA"
folder:
id: 1202
name: "ABC"
type:
typeName: "firstlevel"
defaultthings: null
mainType: "metropolis"
id: 207
name: "CA"
owner:
id: 202
name: null
errorMessage: ""
isError: false
county:
-
id: 0
name: "_1"
folder: ""
city:
Type: "urban"
id: 17206
name: "El Segundo"
numberofinstances: 1
errorMessage: ""
isError: false
从YAML到JSON
"use strict";
var YAML = window.YAML , json, data , yml;
json = JSON.stringify(ko.toJS(finalData), null, 2);
data = JSON.parse(json);
yml = YAML .stringify(data);
return yml;
实际上,我没有想到它的语法错误,因为我在网站上使用了默认代码块:http://jsontoyaml.com/#browser-javascript。
答案 0 :(得分:2)
看起来yaml的格式有点偏差(用http://www.yamllint.com/检查),它应该在---标记之后没有额外的缩进。
我看一下json2yaml.js中的源代码,idenLevel总是indentLevel = indentLevel.replace(/$/, ' ')
var handlers, indentLevel = '', firstLine = true; // add firstLine check
你不需要那个,你只需要它不是第一行(在标记之后) 要解决此问题,您可以在json2yaml.js的第7行添加以下代码
x.forEach
然后在Object.keys(x).forEach
之前的第38行和if (firstLine) {
firstLine = false;
} else {
indentLevel = indentLevel.replace(/$/, ' ')
}
之前的第69行添加此检查
this
您的yaml现在应该是有效的,并且可以解析为JSON。 希望有所帮助。
答案 1 :(得分:0)
另一个解决方法是在forEach中移动缩进代码(放在forEach周围),从而减少缩进级别。然后不需要第一次检查。
可以找到更正的源代码here。请注意第69和71行(对于数组)和106和108(对象)的标识代码。
可以找到NodeJS的here工作示例(需要登录才能运行)和here才能在浏览器中运行:
<html>
<head>
<title>YAML</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.10.0/js-yaml.min.js"
type="text/javascript"></script>
<script src="https://unpkg.com/composix@0.1.3/dist/cpx-module_standalone.min.js"
type="text/javascript"></script>
<script src="https://rawgit.com/jeroenvalk/ComPosiX/master/src/main/javascript/modules/yaml.js"
type="text/javascript"></script>
</head>
<body>
<table border="1">
<tr>
<td><strong>YAML<strong></td>
<td><strong>JSON<strong></td>
</tr>
<tr>
<td><pre id="yaml"></pre></td>
<td><pre id="json"></pre></td>
</tr>
</table>
<script type="text/javascript">
_.module(['yaml'], function(YAML) {
const yaml = YAML.stringify({
"foo": "bar",
"baz": ["qux", "quxx"],
"corge": null,
"grault": 1,
"garply": true,
"waldo": "false",
"fred": "undefined"
});
document.getElementById('yaml').innerHTML = yaml;
const json = JSON.stringify(jsyaml.load(yaml), null, 4);
document.getElementById('json').innerHTML = json;
});
</script>
</body>
</html>