如何在Java中将YAML转换为JSON?

Mig*_*sco 21 java json yaml

我只想将包含yaml的字符串转换为另一个字符串,该字符串包含使用Java的corrseponding转换后的json.

例如,我有这个yaml的内容

---
paper:
   uuid: 8a8cbf60-e067-11e3-8b68-0800200c9a66
   name: On formally undecidable propositions of Principia Mathematica and related systems I.
   author: Kurt Gödel.
tags:
   - tag:
       uuid: 98fb0d90-e067-11e3-8b68-0800200c9a66
       name: Mathematics
   - tag:
       uuid: 3f25f680-e068-11e3-8b68-0800200c9a66
       name: Logic
Run Code Online (Sandbox Code Playgroud)

在名为yamlDoc的String中:

String yamlDoc = "---\npaper:\n   uuid: 8a... etc...";
Run Code Online (Sandbox Code Playgroud)

我想要一些方法,可以将yaml String转换为另一个带有相应json的String,即下面的代码

String yamlDoc = "---\npaper:\n   uuid: 8a... etc...";
String json = convertToJson(yamlDoc); // I want this method
System.out.println(json);
Run Code Online (Sandbox Code Playgroud)

应该打印:

{
    "paper": {
        "uuid": "8a8cbf60-e067-11e3-8b68-0800200c9a66",
        "name": "On formally undecidable propositions of Principia Mathematica and related systems I.",
        "author": "Kurt Gödel."
    },
    "tags": [
        {
            "tag": {
                "uuid": "98fb0d90-e067-11e3-8b68-0800200c9a66",
                "name": "Mathematics"
            }
        },
        {
            "tag": {
                "uuid": "3f25f680-e068-11e3-8b68-0800200c9a66",
                "name": "Logic"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想知道在这个例子中是否存在类似于convertToJson()方法的东西.

我尝试使用SnakeYAML实现这一点,所以这段代码

 Yaml yaml = new Yaml();
 Map<String,Object> map = (Map<String, Object>) yaml.load(yamlDoc);
Run Code Online (Sandbox Code Playgroud)

构造包含已解析的YAML结构的地图(使用嵌套的地图).然后,如果有一个可以将地图转换为json字符串的解析器,它将解决我的问题,但我也没有找到类似的东西.

任何回复将不胜感激.

Cor*_*ein 42

这是一个使用Jackson的实现:

String convertYamlToJson(String yaml) {
    ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());
    Object obj = yamlReader.readValue(yaml, Object.class);

    ObjectMapper jsonWriter = new ObjectMapper();
    return jsonWriter.writeValueAsString(obj);
}
Run Code Online (Sandbox Code Playgroud)

要求:

compile('com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.7.4')
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案,因为它只依赖于 Jackson,而不是两个不同的库。 (2认同)

Mig*_*sco 10

感谢HotLicks提示(在问题评论中)我终于以这种方式使用库org.jsonSnakeYAML实现了转换:

private static String convertToJson(String yamlString) {
    Yaml yaml= new Yaml();
    Map<String,Object> map= (Map<String, Object>) yaml.load(yamlString);

    JSONObject jsonObject=new JSONObject(map);
    return jsonObject.toString();
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是最好的方法,但它对我有用.

  • org.json链接已断开,但是这里是要获取库的maven依赖项:`&lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt; org.json &lt;/ groupId&gt; &lt;artifactId&gt; json &lt;/ artifactId&gt; &lt;version&gt; 20160810 &lt;/ version&gt; &lt;/ dependency&gt; &lt;dependency&gt; &lt;groupId&gt; pl.droidsonroids.yaml &lt;/ groupId&gt; &lt;artifactId&gt; snakeyaml &lt;/ artifactId&gt; &lt;version&gt; 1.18.2 &lt;/ version&gt; &lt;/ dependency&gt; &lt;/ dependencies&gt;` (2认同)

小智 5

非常感谢米格尔·卡拉斯科(Miguel A. Carrasco),他实际上已经解决了这个问题。但他的版本是有限制性的。如果 root 是列表或原始值,他的代码就会失败。最通用的解决方案是:

private static String convertToJson(String yamlString) {
    Yaml yaml= new Yaml();
    Object obj = yaml.load(yamlString);

    return JSONValue.toJSONString(obj);
}
Run Code Online (Sandbox Code Playgroud)

  • JSONValue 从哪里来? (5认同)