2011-02-12 70 views
0

我將用PyYaml創建的Yaml傳遞給SnakeYaml,並且Snakeyaml似乎沒有在第一行之外的任何地方都可以識別出!! exists和python/object聲明的第一行。我已經在Java中設置了相同的對象。是否有一個示例顯示loadAll到對象數組中,其中對象類型被聲明或分配?PyYaml to SnakeYaml --- AWT-EventQueue-0「無法爲標記構造Java對象:yaml.org,2002:java/object:


良好的通話...是遠離電腦,當我最初發布。

這裏是PyYaml,我試圖用SnakeYaml到g的數據等在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: [email protected],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: ...... 

你可以從一小段代碼看,連如果沒有提供所有這些信息,任何知道關於如何任意投擲對象的答案的人都可能可以回答這個問題。

Thx。

解析的關閉兩個感嘆號(!),在每個條目的開始,現在我得到: 映射值在此允許「」 ,1號線,73列:

爲錯誤。使用YAML的重點是減少與解析相關的編碼。如果我不得不回頭解析傳入和傳出的代碼,然後YAML吸!並會很樂意恢復XML或其他任何可以讓python中間件與Java應用程序交談的東西。

+0

你應該發佈不能正常工作的數據以及你用來加載它的代碼。 – Autoplectic 2011-02-12 08:46:06

回答

0

固定。 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 - 這花了很多頭刮和搜索弄清楚,因爲所有'網上的例子實際上是無用的。每頁每頁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。

2

爲了實現您可以將相同的結果:

  • 配置PyYAML跳過標記(完全按照您使用註釋做了「轉換對象,其代表性的字典」)
  • 配置SnakeYAML創建(你完全和你一樣「projectData = gson.fromJson(mystr,ProjectData []。class);」)

如果你迷路了(在你說「它很爛」之前)你可能會問在相應的郵件列表中有一個問題。它可能會幫助您在未來找到合適的解決方案。

+0

瞭解。現在我正在使用並行... YAML可能不會完全「吸」,但需要更多時間來在Python和Java中進行處理。 – kirtcathey 2011-02-20 05:34:14