3

我正在使用 Json-Simple 使用 Json-Simple lib 编写配置文件,但在将 json 字符串转换为映射时遇到问题。

调试我发现 parse 方法返回一个 Map 对象!但是当我尝试直接转换为 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 是 list[...]而不是 object {...}

于 2012-10-18T00:13:55.073 回答