当前位置: 首页 > 面试题库 >

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

於乐
2023-03-14
问题内容

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

问题答案:

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



 类似资料:
  • 因此,我想删除所有内部卷曲括号,同时重命名值,如 {“意向”:“P&P_购买”,“Value1”:日期:12月30日,产品:印楝尿素OMIFCO(45公斤),数量:18公吨,INV_NO:NRKT07003160;“Value2”:日期:12月19日,产品:印楝尿素OMIFCO(45公斤),数量:18公吨,INV_NO:NRKT07003160;“Value3”:日期:1月19日,产品:印楝尿素O

  • 问题内容: 我已经尝试了所有方法,但是解决方案非常丑陋,我真的想要一个直接的答案,是否可以改进(这意味着是否需要使用其他实现)。 问题在于带有GSON的Map of Maps: 根据Firebug给我以下回应: 大约有200个,但是只有两个。到目前为止,这是我在课堂上要解析的内容: 所以我这样访问数据: 但是正如您所看到的,这将是很长的时间。另一个问题是某些“值”中包含“&”号,这意味着我不能在此

  • JSONMappingException:无法从JSON整数实例化类型[simple type,class AuthenticateUser]的值;在com.fasterxml.jackson.databind.deser.std.stdvalueinstantiator.createfromint(stdvalueinstantiator.java:316)在com.fasterxml.jack

  • 使用简单的JSONParser将字符串解析为JSONObject,没有任何问题。后来听说了jackson解析器,它似乎比简单的JSONParser更快。但问题是,如果jsonobject中有一个jsonobject,在通过Jackson解析器进行解析后,无法提取内部jsonobject,这在简单的JSONParser中不是这样的,而且要容易得多。 例如:{"Key1":"Value1","Key2

  • 问题内容: 我想用Android上的任何键解析JSON。JSON数据包含任何键,数组或值。这是JSON数据和我的工作代码。我想通过使用JSON解析将JSON数据放入类中。 JSON数据: 我的代码: 请帮我。 问题答案: 是的,这是可能的。 将收到的JSON放在中。您可以循环通过并从中退出。 例: 我希望这就是你想要的

  • 您好,我正在尝试将我的graphql查询格式化为json请求,如下所示。我想以字符串形式传递id,值为“3”,当我将其作为json请求发送时,graphql会以错误的形式拒绝。我如何解决这个问题? edit1中添加的架构:`#公开指定此标量行为的URL。指令@specifiedBy( URL: String!)on|SCALAR 架构{query:RootQueryType mutation:mu