我正在使用Json-Simple编写一个配置文件,使用JSon-Simple lib,但是我在将json字符串转换为map时遇到了问题。
调试时,我发现parse方法返回的对象是一个Map!但是当我尝试直接转换为LinkedMap时,我得到了一个ClassCastException:
String json = aceptaDefault();
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);
LinkedHashMap map = (LinkedHashMap)obj;发布于 2012-10-18 08:13:55
除非您知道底层对象实际上是一个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是一个列表[...]而不是一个对象{...}。
https://stackoverflow.com/questions/12938442
复制相似问题