无法使用yaml.js将YAML解析为JSON

时间:2016-07-04 07:41:05

标签: javascript json parsing yaml

我是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

2 个答案:

答案 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>