【问题标题】:PyYaml to SnakeYaml --- AWT-EventQueue-0" Can't construct a java object for tag:yaml.org,2002:java/object:PyYaml 到 SnakeYaml --- AWT-EventQueue-0" 无法为 tag:yaml.org,2002:java/object 构造 java 对象:
【发布时间】:2011-06-26 00:23:16
【问题描述】:

我正在将使用 PyYaml 创建的 Yaml 传递给 SnakeYaml,而 SnakeYaml 似乎无法识别第一行之外的任何内容!存在并声明了 python/object。我已经在 J​​ava 中设置了相同的对象。是否有一个示例将 loadAll 显示到对象数组中,其中对象类型被断言或分配?


好电话...我最初发帖时不在电脑旁。

这是我尝试使用 SnakeYaml 进入 Java 应用程序的 PyYaml 数据:

--- !!python/object:dbmethods.Project.Project {dblogin: kirtstrim7900, dbname: 92218kirtstrim_wfrogls,dbpw: 1234567895#froggy, preference1: '', preference2: '', preference3: '', projName: CheckPoint Firewall Audit - imp, projNo: 1295789430544+CheckPoint Firewall Audit - imp, projectowner: kirtcathey@sysrisk.com,result1label: Evidence, result2label: Recommend, result3label: Report, resultlabel: Response,role: owner, workstep1label: Objective, workstep2label: Policy, workstep3label: Guidance,worksteplabel: Procedure}

不仅仅是上面的一个实例,而是几个对象,所以需要在 SnakeYaml 中使用 loadAll.... 除非有人知道更好。

至于代码,这是我从 SnakeYaml 文档中获得的全部内容:

for (Object data : yaml.loadAll(sb.toString())) {   
    System.out.println(data.toString());
}

然后,抛出这个错误:

Exception in thread "AWT-EventQueue-0" Can't construct a java object for tag:yaml.org,2002:java/object: ...... 
Caused by: org.yaml.snakeyaml.error.YAMLException: Class not found: ......

从小代码 sn-p 中可以看出,即使没有提供所有这些信息,任何知道如何任意投射对象的答案的人都可以回答这个问题。

谢谢。

解析每个条目开头的两个感叹号(!!),现在我得到: 此处不允许映射值 在“”中,第 1 行,第 73 列:

作为一个错误。使用 YAML 的全部目的是减少与解析相关的编码。如果我出于某种原因不得不转身解析传入和传出的代码,那么 YAML 很糟糕!并且很乐意恢复 XML 或任何其他允许 python 中间件与 java 应用程序通信的东西。

【问题讨论】:

  • 您应该发布不工作的数据以及您用来加载它的代码。

标签: java python yaml pyyaml snakeyaml


【解决方案1】:

为了达到同样的效果,你可以:

  • 配置 PyYAML 以跳过标记(就像您对注释“将对象转换为其表示形式的字典”所做的那样)
  • 配置 SnakeYAML 以创建您期望的对象(就像您使用“projectData = gson.fromJson(mystr, ProjectData[].class);”所做的那样)

如果您迷路了(在您说“这很糟糕”之前),您可以在相应的邮件列表中提问。它可能会帮助您在未来找到合适的解决方案。

【讨论】:

  • 明白。现在我正在同时使用这两种方法...... YAML 可能不会完全“糟糕”,但在 Python 和 Java 中处理都需要更多时间。
【解决方案2】:

已修复。 YAML 很烂,所以不要使用它。关于 SnakeYAML 是如何从 PyYaml 派生的各种谷歌结果,但没有人明确说明 PyYaml 的转储格式与 SnakeYAML 的 loadAll 例程如何配合使用。

此外,YAML 的性能很糟糕,JSON 更简单,更容易实现。在我们的中间件所在的 Python 中(大多数处理发生),YAML 的处理时间几乎是 JSON 的两倍!

如果您使用的是 Python 2.6 或更高版本,则只需

 import json
    json_doc = json.dumps(projects, default=convert_to_builtin_type)
                    print json_doc
  def convert_to_builtin_type(obj):
     print 'default(', repr(obj), ')'
     # Convert objects to a dictionary of their representation
     d = { '__class__':obj.__class__.__name__,
          '__module__':obj.__module__,
          }
     d.update(obj.__dict__)
     return d

然后在 Java 客户端(加载)端,使用 GSon - 这需要大量的头和搜索才能弄清楚,因为 'net 上的所有示例实际上都是无用的。每个每页有 500 个广告的博主都会向您展示如何转换一个愚蠢的对象,而上次我创建应用程序时,我使用了列表、数组或任何包含多个对象的东西!

try {
    serverAddress = new URL("http://127.0.0.1:5000/projects/" + ruser.getUserEmail()+"+++++"+ruser.getUserHash());
    //set up out communications stuff
    connection = null;

    //Set up the initial connection
    connection = (HttpURLConnection)serverAddress.openConnection();
    connection.setRequestMethod("GET");
    connection.setDoOutput(true);
    connection.setReadTimeout(100000);

    connection.connect();

    //get the output stream writer and write the output to the server
    //not needed in this example

    rd  = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    sb = new StringBuilder();

    while ((line = rd.readLine()) != null)
    {
       sb.append(line + '\n');
    }
    String mystr = sb.toString();
    // Now do the magic.
    Gson gson = new Gson();
    projectData = gson.fromJson(mystr, ProjectData[].class);    
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
finally
{
    //close the connection, set all objects to null
    connection.disconnect();
    rd = null;
    sb = null;
    connection = null;
}


return projectData;

完成!简而言之 - YAML 糟透了并使用 JSON!另外,http 连接代码大部分是从这个网站上剪下来的……现在我需要弄清楚 https。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多