PyYaml到SnakeYaml --- AWT-EventQueue-0“无法为标记构造java对象:yaml.org,2002:java / object:

时间:2011-02-12 08:30:32

标签: java python yaml pyyaml snakeyaml

我将使用PyYaml创建的Yaml传递给SnakeYaml,Snakeyaml似乎没有认识到第一行以外的任何内容!存在并声明python / object。我已经在Java中设置了相同的对象。是否有一个示例将loadAll显示在一个对象数组中,其中对象类型被声明或赋值?


好的电话......我最初发布时远离电脑。

以下是来自PyYaml的数据,我试图使用SnakeYaml进入Java应用程序:

--- !!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 docs获得的全部内容:

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: ......

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

THX。

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

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

2 个答案:

答案 0 :(得分:2)

要获得相同的结果,您可以:

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

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

答案 1 :(得分: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 - 这需要大量的头脑和搜索才能弄明白,因为'网上的所有示例实际上都是无用的。每个博客每页有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。