首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Json-Simple从JSON解析到Map并保留键顺序

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

Stack Overflow用户
提问于 2012-10-17 23:59:35
回答 1查看 12.5K关注 0票数 3

我正在使用Json-Simple编写一个配置文件,使用JSon-Simple lib,但是我在将json字符串转换为map时遇到了问题。

调试时,我发现parse方法返回的对象是一个Map!但是当我尝试直接转换为LinkedMap时,我得到了一个ClassCastException:

代码语言:javascript
复制
 String json = aceptaDefault();
 JSONParser parser = new JSONParser();
 Object obj = parser.parse(json);  
 LinkedHashMap map = (LinkedHashMap)obj;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
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,并且您可能只是想这样做:

代码语言:javascript
复制
String json = aceptaDefault();
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);  
Map map = (Map)obj;

您仍然可能得到一个ClassCastException,但前提是json是一个列表[...]而不是一个对象{...}

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12938442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档