2013-12-07 53 views
0

我想以最簡單的方式解析一些JSON字符串表示數組或地圖。我有整個JSON字符串,不需要流式傳輸。使用Jackson將JSON字符串解析爲原始Java類型?

我想要做的就是儘可能相似的內容:

Object obj = parseJSON(theString); 

這裏的obj會再抱任何地圖或列表的一個實例(我不能提前知道哪個)。 JSON對象可以任意嵌套在地圖和數組中,但所有類型都可以表示爲基本Java類型:String,Integer,Double,Boolean plus Map和ArrayList,沒有別的。

到目前爲止,我發現的所有簡單示例都要求我知道類型是什麼以及需要哪些類型,但是我想讓所有這些都執行JSON解析器,因爲我根本不會提前知道我得到的是什麼。

如果傑克遜不是最好的圖書館,我還能用什麼?

+0

轉到json.org並從Java中選擇一個約20的套件。 –

+0

(我看到很多Java人都在爲簡單的JSON問題而苦苦掙扎,因爲他們都非常迷戀傑克遜,而且是克隆人。) –

+1

我非常喜歡傑克遜,它很傷心。 – Vidya

回答

0

另一種選擇,你應該決定拋棄傑克遜(傑克遜是好的,我在JSON戰爭相當無關)是json-simple.

JSONObject jObject = JSONValue.parse(String jsonString); 

由於JSONObject的java.util.HashMap的延伸,一切都應該工作。

+0

不,因爲如果JSON字符串表示一個數組,我想在這種情況下列表。正如我在發佈後幾秒鐘發現的那樣,readValue(theString,Object.class)會這樣做:如果JSON是一個數組,則它會給我一個ArrayList,如果JSON是一個映射,則會給出一個LinkedHashMap。 – Johsm

+0

我想我的問題是「那麼是什麼」?你有一個對象是一個Map或一個List,但是你可以用它做什麼?你會做一個instanceof?猜猜我不完全明白你的問題... – user949300

4

所有你需要做的是這樣的:

ObjectMapper mapper = new ObjectMapper(); 
Map<String,Object> map = mapper.readValue(theString, Map.class); 

我敢肯定,這將返回一個LinkedHashMap,如果你的關心。

在我看來,你不會找到一個更好的Java的串行器/解串器< - > JSON比傑克遜。但是還有很多其他人喜歡GSON

+0

我一直在苦苦掙扎的問題是,我只看到了一個必須指定的例子,就像你的例子中的Map或Array或我自己的類型。我太傻了,看不到我實際上只是指定了Object.class,它會按照我的意願去做。 – Johsm

+1

哦,是的,你也可以這樣做。我以爲你想明確使用'Map'。但'對象'工程。 – Vidya

0

愚蠢的問題,答案很簡單:

import com.fasterxml.jackson.databind.ObjectMapper; 
ObjectMapper mapper = new ObjectMapper(); 
Object obj = mapper.readValue(theString, Object.class); 

這似乎做的正是我想要的。它也非常明顯!