2012-11-02 193 views
2

我讀過一堆不同的文章,比較和教程,它們使用不同的JSON庫來解析(並創建)JSON到Java對象中。無論如何,我認爲我已經得到了正確的事實,因爲我決定使用名爲Jackson的JSON庫。Android JSON解析(傑克遜)

GSON簡單而強大,但可以減慢我的速度。所以我決定嘗試這個傑克遜的東西,但是,這裏的解析似乎比GSON更令人困惑。

我想解析的值的數據類型只是一個布爾型

這就是我想要的JSON解析的樣子:

{"FooResult":true} 

所以我確實需要從關鍵FooResult選擇值幫助,然後分析其價值爲布爾。

這是我迄今所做的:

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, Boolean.class); 

但這顯然代碼給了我我沒有選擇,這是FooResult關鍵,我很感興趣,讀了錯誤原因&解析爲布爾值。

+0

mapper.readValue(json,Boolean.class); - 這不起作用,因爲JSON不代表布爾類型/值。 JSON是具有單個屬性的對象,並且該屬性是布爾(或布爾)類型的值。 –

回答

5

您應該創建一個新的類是這樣的:

class MyClass { 
    public boolean FooResult; 
} 

,並使用此代碼加載數據:

MyClass myObject = mapper.readValue(json, MyClass.class);

然後,您可以用訪問值myObject.FooResult

+0

不幸的是,這是行不通的。我得到一個JsonMappingException,它告訴我傑克遜庫不能像Bean那樣爲我反序列化對象。 – parek

+1

西蒙的回答是正確的。請注意,沒有必要將FooResult字段定義爲公共成員。 –

+0

是的,它實際上甚至可以將其定義爲私人成員,這要歸功於Jackson使用Reflection來讀取/寫入值。我通常把這些類放在他們自己的Java文件中,但是使用下面建議的@Parek靜態方法也可以。 –

0

好吧,這是跛腳。甚至當我重新思考這個問題的時候,我也很失望。一直以來的問題是,你想解析的對象的類別需要是靜態的。我已經嘗試了西蒙建議的四五次之前,我甚至在今天發佈這個問題之前,但問題始終是,該類不是靜態

所以現在它終於起作用了。

static class FooClass 
{ 
    public boolean FooResult; 
} 

並用於解析過程。

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
FooClass fooClass = null; 
try 
{ 
    fooClass = mapper.readValue(json, FooClass.class); 
} 
boolean result = fooClass.FooResult; 
+2

「你想要解析的對象的類需要是靜態的」 - 這是不正確的。我猜你是在將目標類聲明爲其他類的內部類。也許你只需要將FooClass類的聲明移到任何其他類的聲明之外。我記得,格森處理內部類(德)序列化有點不同於傑克遜。所以,也許這就是爲什麼Gson解決方案與Jackson無法完全一樣的原因。 –

+0

FWIW,非靜態內部類不起作用的原因是它們必須獲得對周圍類實例的引用(「implicit this pointer」)。這在反序列化過程中通常是不可用的;至少在你的例子中沒有周圍的POJO。從理論上講,我們可以通過傳遞'null'作爲父參考,我猜...這可能會導致其他奇怪的問題,但至少會反序列化。 – StaxMan