0

PyYamlで作成されたYamlをSnakeYamlに渡していますが、Snakeyamlは最初の行を超えて何も認識していないようです!! 存在し、python/objectが宣言されています。私はすでにJavaで同じオブジェクトを設定しています。オブジェクトタイプがアサートまたは割り当てられているオブジェクト配列に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: ......

小さなコードスニペットからわかるように、このすべての情報が提供されていなくても、オブジェクトを任意にキャストする方法についての答えを知っている人なら誰でも、おそらく質問に答えることができます。

どうも。

各エントリの先頭にある2つの感嘆符(!!)を解析すると、次のようになります。「」の1行73列でマッピング値は許可されていません。

エラーとして。YAMLを使用する目的は、解析に関連するコーディングを減らすことでした。なんらかの理由で着信コードと発信コードを振り返って解析する必要がある場合、YAMLは最悪です!! そして、PythonミドルウェアがJavaアプリケーションと通信できるようにするXMLまたはその他のものを喜んで元に戻します。

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のほぼ2倍の時間がかかります!!

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を使用します。ネット上のすべての例は事実上役に立たないため、これには多くの頭を悩ませて検索する必要がありました。1ページに500個の広告があるすべてのブロガーは、1つの愚かなオブジェクトを変換する方法を示しています。前回アプリを作成したときは、リスト、配列、または複数のオブジェクトを保持するものを使用しました。

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 に答える