2012-07-16 51 views
12

我在Android項目中使用Jackson 1.9.5來解析JSON文件。具有任意JSON密鑰的Jackson ObjectMapper

到目前爲止,我還沒有遇到任何問題,可以解析精細用下面的代碼文件:

AssetManager mgr = getAssets(); 
ObjectMapper mapper = new ObjectMapper(); 

try { 
    InputStream ifp = mgr.open("detail_schema.json"); 
    schema = mapper.readValue(ifp, DetailSchema.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

凡DetailSchema類由基本類型和類別的組合的。我現在運行到哪裏我想分析一些JSON像下面這樣的問題:

"fields": { 
    "Suburb": "Paddington", 
    "State": "NSW", 
    "Post Code": "2074", 
    "Lollipop": "Foo Bar Haz" 
} 

在哪裏我不可能知道前手的映射鍵(也可以是用戶自定義)。因此,我不確定關聯的Java類應該是什麼樣子。

也就是說,在這個例子中,它可能看起來像:

public class MyClass { 

    public String Suburb; 
    public String State; 
    public String PostCode; 
    public String Lollipop; 

} 

但這可能不是JSON文件的另一個實例是正確的。理想情況下,我需要一些方法讓傑克遜將值映射到NameValuePair之類的值。我懷疑在這種情況下,自動對象映射可能不是一個選項 - 有人可以確認或否認這一點?

回答

16

你有兩種選擇。您可以使用readTree in ObjectMapper,它將返回JsonNode。用JsonNode工作很像一棵樹的工作,這樣你就可以讓孩子節點,讀取數值,等等:

InputStream ifp = mgr.open("detail_schema.json"); 
JsonNode root = mapper.readTree(ifp); 
JsonNode fields = root.get("fields"); 
for (JsonNode children : fields.getElements()) { 
    // ... 
} 

然後,你需要手動構建DetailSchema對象。

或者,你可以讓傑克遜反序列化的地圖,在這種情況下,你用你的代碼,但在那裏MyClass的會是這樣的:

public class MyClass { 
    public Map<String, Object> fields; 

    // getter/setters 
} 

你或許可以爲String類型的映射值那麼如果你確定輸入是json中的文本。 (其實,我不確定傑克遜做了什麼類型的執法,也許它會允許任何東西......)

+1

非常感謝!一張地圖對我的目的會很好。 – aaronsnoswell 2012-07-16 05:44:27

+0

您實際上不必使用自定義類來獲得Map,您可以將Jackson直接反序列化爲Map接口的實現,例如:Map jsonFields = mapper.readValue(ifp,HashMap的.class)' – brianmearns 2015-09-09 14:09:54

相關問題