raf*_*uru 3 java json json-simple
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
Tom*_*ure 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;
Run Code Online (Sandbox Code Playgroud)
这应该保留原始JSON中的键顺序.
如果您不关心键顺序,则不需要LinkedHashMap,您可能只是想这样做:
String json = aceptaDefault();
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);
Map map = (Map)obj;
Run Code Online (Sandbox Code Playgroud)
您仍然可能会获得ClassCastException,但前提是json是列表[...]而不是对象{...}.
| 归档时间: |
|
| 查看次数: |
10866 次 |
| 最近记录: |