我将使用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应用程序通信的东西。
答案 0 :(得分:2)
要获得相同的结果,您可以:
如果您迷路了(在您说“很糟糕”之前),您可以在相应的邮件列表中提出问题。它可能会帮助您在将来找到合适的解决方案。
答案 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。