0

以下のようにjsonオブジェクトをデシリアライズしています

 {
     "b":"value1",
     "a":"value2",
     "d":"value3",
     "c":"value4",
     "f":"value5",
     "e":"value6"
 }

しかし、私は以下のように ClassCastException を取得しています

 java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap

私の逆シリアル化コードは

LinkedHashMap<String, String> map = new JSONDeserializer<LinkedHashMap<String, String>>().deserialize(JSONstring);

しかし、LinkedHashMap の代わりに HashMap を使用すると動作しますが、出力は以下のようにソートされます (元の順序ではありません)。

 {
     a=value2, 
     b=value1, 
     c=value4, 
     d=value3, 
     e=value6, 
     f=value5
 }

出力を元の順序で取得したい。この関連リンク Flex JSONがLinkedHashMapを適切にシリアル化/逆シリアル化でき ないことがわかりましたが、ObjectFactoryの使用方法がわかりませんでした。

助けていただければ幸いです!

前もって感謝します!

4

1 に答える 1

0

(免責事項: flexjson をダウンロードし、そのソース コードをデバッグしただけなので、私の答えは少し不完全かもしれません。)

要するに:

  • 通常、flexjson を使用して元の順序でエントリを取得することはできません。
  • カスタムを書いてもObjectFactoryうまくいきません。
  • これはおそらく意図的で正しいものです。

詳細に:

まず、ジェネリックの使用はnew JSONDeserializer<LinkedHashMap<String,String>>()コンパイル可能なコードにのみ影響し、flexjson はこの情報を使用して実際に を返すことができませんLinkedHashMap<String,String>(これは、コンパイラがジェネリックを削除し、実装クラスが実行時にこのジェネリック型の情報を持っていないためです)。

したがって、逆シリアル化中に何が起こるかを詳しく調べると、入力文字列の解析中に、データが自動的に正しい型 (文字列、日付、数値、リストなど) に変換されるようです。これは、必要なデータ型のある種の自動検出を使用して行われます。JSON はそのデータに型情報を提供しないため、flexjson にはデータ型をサポートする組み込みリストがあります。また、カスタム マッピングを使用して、適切なクラス情報が与えられたときにオブジェクト プロパティに値を割り当てることもできます (シリアル化の際、flexjson はclassこの型情報を格納するためにデータにフィールドを追加します。手動で設定することもできます。ドキュメントを参照してください)。

しかし、要点は - http://json.orgによると-

オブジェクトは、名前と値のペアの順序付けられていないセットです。

flexjson は内部的に (順序付けされていない) マップを使用して、一時オブジェクトのキーと値を格納します。flexjson にデータを として返すように指示したとしても、データはに変換される前にLinkedHashMapまだ に入れられているため、その時点では元の順序は使用できません。(これは、マップの作成をに置き換えることで修正される可能性がありますが、自分では試していません。) HashMapLinkedHashMapflexjson.JSONTokener, line 442LinkedHashMap

結論:

この動作は custom を提供しても変更できないように見えるObjectFactoryため、コードを理解する限り、元のフィールドの順序を保持することはできません。(なぜこれがあなたのプロジェクトにとって重要なのか聞いてもよろしいですか?)

とにかく誰かが解決策を見つけたら、躊躇せずに私を修正してください。

于 2014-01-03T14:22:21.303 に答える