如何使用Json-Simple从JSON解析到Map并保留键顺序

问题描述

除非您知道基础对象实际上是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 {...}

解决方法

我正在使用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;

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”