3

Json-Simple lib を使用して構成ファイルを作成するために Json-Simple を使用していますが、json 文字列をマップに変換する際に問題が発生しています。

デバッグ parse メソッドがマップであるオブジェクトを返すことがわかりました! しかし、LinkedMap に直接キャストしようとすると、ClassCastException が発生します。

 String json = aceptaDefault();
 JSONParser parser = new JSONParser();
 Object obj = parser.parse(json);  
 LinkedHashMap map = (LinkedHashMap)obj;
4

1 に答える 1

14

基になるオブジェクトが実際に LinkedHashMap である (または LinkedHashMap を拡張するクラスのインスタンスである) ことがわかっていない限り、Map を LinkedHashMap にキャストすることはできません。

JSON-Simple はデフォルトでおそらく内部で HashMap を使用しており、意図的に元の JSON のキーの順序を保持していません。どうやら、この決定はパフォーマンス上の理由によるものでした。

しかし、あなたは運がいいです!これを回避する方法があります。JSON をデコード (解析) するときに、カスタム ContainerFactory をパーサーに提供できることがわかりました。

http://code.google.com/p/json-simple/wiki/DecodingExamples#Example_4_-_Container_factory

String json = aceptaDefault();
JSONParser parser = new JSONParser();

ContainerFactory orderedKeyFactory = new ContainerFactory()
{
    public List creatArrayContainer() {
      return new LinkedList();
    }

    public Map createObjectContainer() {
      return new LinkedHashMap();
    }

};

Object obj = parser.parse(json,orderedKeyFactory);  
LinkedHashMap map = (LinkedHashMap)obj;

これにより、元の JSON のキーの順序が保持されます。

キーの順序を気にしない場合は、LinkedHashMap は必要ありません。おそらくこれを行うつもりでした:

String json = aceptaDefault();
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);  
Map map = (Map)obj;

ClassCastException が発生する可能性はありますが、json が[...]object ではなく list である場合に限ります{...}

于 2012-10-18T00:13:55.073 に答える