簡體   English   中英

如何使用Json-Simple從JSON解析到Map並保留鍵順序

[英]How to parse from JSON to Map with Json-Simple and retain key order

我正在使用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是一個列表[...]而不是對象{...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM