基になるオブジェクトが実際に 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 である場合に限ります{...}
。