Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中从YAML转换为JSON?_Java_Json_Yaml - Fatal编程技术网

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

如何在Java中从YAML转换为JSON?,java,json,yaml,Java,Json,Yaml,我只想使用Java将一个包含yaml的字符串转换为另一个包含相应转换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:

我只想使用Java将一个包含yaml的字符串转换为另一个包含相应转换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
在名为yamlDoc的字符串中:

String yamlDoc = "---\npaper:\n   uuid: 8a... etc...";
我想要一些方法,可以将yaml字符串转换成另一个带有相应json的字符串,即以下代码

String yamlDoc = "---\npaper:\n   uuid: 8a... etc...";
String json = convertToJson(yamlDoc); // I want this method
System.out.println(json);
应打印:

{
    "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"
            }
        }
    ]
}
我想知道是否存在类似于本例中的convertToJson()方法的东西

我试着用,所以这个代码

 Yaml yaml = new Yaml();
 Map<String,Object> map = (Map<String, Object>) yaml.load(yamlDoc);
Yaml-Yaml=新的Yaml();
Map Map=(Map)yaml.load(yamlDoc);
构造包含已解析YAML结构的映射(使用嵌套映射)。然后,如果有一个解析器可以将映射转换为json字符串,它将解决我的问题,但我也没有找到类似的东西

任何回复都将不胜感激。

多亏了HotLicks提示(在问题注释中),我最终使用库实现了转换,并以这种方式:

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();
}
private静态字符串convertToJson(字符串yamlString){
Yaml Yaml=新的Yaml();
Map Map=(Map)yaml.load(yamlString);
JSONObject JSONObject=新的JSONObject(映射);
返回jsonObject.toString();
}

我不知道这是不是最好的方法,但对我来说很有效。

多亏了米格尔·A·卡拉斯科,事实上他解决了这个问题。但他的说法是有限制的。如果root是list或primitive值,他的代码将失败。最普遍的解决方案是:

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

    return JSONValue.toJSONString(obj);
}

下面是一个使用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);
}
要求:

compile('com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.7.4')

我发现该示例在将Swagger(OpenAPI)YAML转换为JSON时没有生成正确的值。我编写了以下例程:

  private static Object _convertToJson(Object o) throws JSONException {
    if (o instanceof Map) {
      Map<Object, Object> map = (Map<Object, Object>) o;

      JSONObject result = new JSONObject();

      for (Map.Entry<Object, Object> stringObjectEntry : map.entrySet()) {
        String key = stringObjectEntry.getKey().toString();

        result.put(key, _convertToJson(stringObjectEntry.getValue()));
      }

      return result;
    } else if (o instanceof ArrayList) {
      ArrayList arrayList = (ArrayList) o;
      JSONArray result = new JSONArray();

      for (Object arrayObject : arrayList) {
        result.put(_convertToJson(arrayObject));
      }

      return result;
    } else if (o instanceof String) {
      return o;
    } else if (o instanceof Boolean) {
      return o;
    } else {
      log.error("Unsupported class [{0}]", o.getClass().getName());
      return o;
    }
  }
private static Object\u convertToJson(Object o)抛出JSONException{
if(o映射的实例){
Map=(Map)o;
JSONObject结果=新建JSONObject();
对于(Map.Entry stringObjectEntry:Map.entrySet()){
String key=stringObjectEntry.getKey().toString();
put(key,_convertToJson(stringObjectEntry.getValue());
}
返回结果;
}else if(o ArrayList实例){
ArrayList ArrayList=(ArrayList)o;
JSONArray结果=新的JSONArray();
对于(对象arrayObject:arrayList){
result.put(_convertToJson(arrayObject));
}
返回结果;
}else if(o字符串实例){
返回o;
}else if(布尔值的o实例){
返回o;
}否则{
错误(“不支持的类[{0}]”,o.getClass().getName());
返回o;
}
}
然后我可以使用SnakeYAML加载并输出JSON,如下所示:

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

JSONObject jsonObject = (JSONObject) _convertToJson(map);
System.out.println(jsonObject.toString(2));
Yaml-Yaml=新的Yaml();
Map Map=(Map)yaml.load(yamlString);
JSONObject JSONObject=(JSONObject)\u convertToJson(map);
System.out.println(jsonObject.toString(2));

在搜索同一问题的解决方案时,我被引导到了这个问题

我还偶然发现了以下文章

Jackson JSON库似乎有一个基于SnakeYAML的YAML扩展。
由于Jackson是JSON事实上的库之一,我想我应该把它链接到这里。

谢谢,Miguel!你的例子帮助很大。我不想使用“JSON java”库。我更喜欢格森。但将JSON java的逻辑转换为GSON的域模型并不困难。单个函数可以实现以下功能:

/**
 * Wraps the object returned by the Snake YAML parser into a GSON JsonElement 
 * representation.  This is similar to the logic in the wrap() function of:
 * 
 * https://github.com/stleary/JSON-java/blob/master/JSONObject.java
 */
public static JsonElement wrapSnakeObject(Object o) {

    //NULL => JsonNull
    if (o == null)
        return JsonNull.INSTANCE;

    // Collection => JsonArray
    if (o instanceof Collection) {
        JsonArray array = new JsonArray();
        for (Object childObj : (Collection<?>)o)
            array.add(wrapSnakeObject(childObj));
        return array;
    }

    // Array => JsonArray
    if (o.getClass().isArray()) {
        JsonArray array = new JsonArray();

        int length = Array.getLength(array);
        for (int i=0; i<length; i++)
            array.add(wrapSnakeObject(Array.get(array, i)));

        return array;
    }

    // Map => JsonObject
    if (o instanceof Map) {
        Map<?, ?> map = (Map<?, ?>)o;

        JsonObject jsonObject = new JsonObject();
        for (final Map.Entry<?, ?> entry : map.entrySet()) {
            final String name = String.valueOf(entry.getKey());
            final Object value = entry.getValue();
            jsonObject.add(name, wrapSnakeObject(value));
        }

        return jsonObject;
    }

    // everything else => JsonPrimitive
    if (o instanceof String)
        return new JsonPrimitive((String)o);
    if (o instanceof Number)
        return new JsonPrimitive((Number)o);
    if (o instanceof Character)
        return new JsonPrimitive((Character)o);
    if (o instanceof Boolean)
        return new JsonPrimitive((Boolean)o);

    // otherwise.. string is a good guess
    return new JsonPrimitive(String.valueOf(o));
}

使用POJO将允许您使用现有库,并且可能会自动执行。否则,您需要一个YAML解析器,手动检查它,并手动创建转换后的JSON?阅读你的帖子,我只能看到你不想做的事情。你准备做什么?抱歉,-1,因为没有显示解决此问题的任何尝试。我看到的只是我的问题,请帮我解决。我知道。也许可以使用
newobjectmapper(new YAMLFactory())
将YAML读入映射结构,然后使用
new ObjectMapper()
编写JSON?谢谢你的建议superEb,我不知道Jackson能读懂YAML当然有一些工具可以将YAML转换为映射和列表。一旦这样转换,生成相应的JSON就很简单了。JSONValue来自哪里?我相信他们使用的是JSON simple(javadoc:),但该项目几乎被放弃了。使用javax.json会将方法从JSONValue.ToJsonString更改为JSONValue.tostring。由于第3行中未经检查的强制转换,该方法不起作用。每次.org.json链接断开时都会抛出ClassCastException,但这里是获取库的maven依赖项:
org.json json 20160810 pl.droidsonroids.yaml snakeyaml 1.18.2
最佳答案,因为它只依赖Jackson,而不是两个不同的库。对我有效的库是:
objectmapperyamlreader=newobjectmapper(newyamlfactory());Object obj=yamlReader.readValue(新文件(“src/main/resources/File.yaml”)、Object.class);ObjectMapper jsonWriter=新的ObjectMapper();字符串json=jsonWriter.writeValueAsString(obj);System.out.println(json)这对我不起作用,当我们有一个数组时,它是覆盖元素
Yaml yaml = new Yaml();
Map<String, Object> yamlMap = yaml.load(yamlString);
JsonElement jsonElem = wrapSnakeObject(yamlMap);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(jsonElem));