0

我正在将使用 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: ......

正如您从小代码片段中看到的那样,即使没有提供所有这些信息,任何知道如何任意投射对象的答案的人都可能会回答这个问题。

谢谢。

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

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

4

2 回答 2

2

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

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

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

于 2011-02-15T15:12:45.290 回答
0

固定的。YAML 很烂,所以不要使用它。关于 SnakeYAML 是如何从 PyYaml 派生出来的各种 Google 结果,但没有人明确说明 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。

于 2011-02-12T10:27:28.200 回答