2015-09-08 52 views
2

我有一個JSON我想要一個將其轉換爲HashMap。我有以下的代碼 -如何映射到數組的HashMap?

ObjectMapper mapper = new ObjectMapper(); 
Map<String, String> jsonData = new HashMap<String, String>(); 

jsonData = mapper.readValue(userPropertyJson, new TypeReference<HashMap<String,String>>(){}); 

它工作正常,如果輸入JSON是

{"user":1, "entity": "email"} 

但當JSON是如下失敗 -

{"user":1, "entity": ["email","fname","lname","phone"]} 

如何映射到數組的HashMap也是?

+1

HashMap中<字符串,對象> ?? –

+2

您有不同類型的對象作爲值。所以'HashMap '可能會。 –

+1

無論如何,這是一個非常糟糕的做法。你最終會檢查給定的鍵的值是什麼類型等等。而不是試圖讓它與Map 一起工作,我會重新訪問我的模型並創建它,所以我知道我將在不同的字段中獲得什麼類型。 –

回答

4

聲明一個通用的HashMapString作爲一個鍵和對象作爲一個值,因爲你不知道值的類型。

Map<String, Object> 

和分配錯誤類型的提防,同時檢索數據

2

使用Map<String, Object>。例如

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.JsonMappingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 


public class JacksonParser { 

    public static void main(String[] args) { 
     String userPropertyJson = "{\"user\":1, \"entity\": [\"email\",\"fname\",\"lname\",\"phone\"]}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
     Map<String, Object> jsonData = new HashMap<String, Object>(); 

     jsonData = mapper.readValue(userPropertyJson, new TypeReference<HashMap<String,Object>>(){}); 
     System.out.println(jsonData); 
     } catch (JsonParseException e) { 
     System.out.println(e.getMessage()); 
     } catch (JsonMappingException e) { 
     System.out.println(e.getMessage()); 
     } catch (IOException e) { 
     System.out.println(e.getMessage()); 
     } 
    } 

} 
1

如果你事先知道你的JSON將始終具有相同的格式(String鍵映射到List<String>,無論是與一個單一的元素或多種元素),那麼你可以使用ACCEPT_SINGLE_VALUE_AS_ARRAY反序列化功能:

ObjectMapper mapper = new ObjectMapper() 
    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 

String jsonWithArray = 
    "{\"user\": 1, \"entity\": [\"email\", \"fname\", \"lname\", \"phone\"]}"; 

Map<String, List<String>> map1 = 
    mapper.readValue(
     jsonWithArray, 
     new TypeReference<HashMap<String, List<String>>>() {}); 

System.out.println(map1); // {user=[1], entity=[email, fname, lname, phone]} 

String jsonWithoutArray = "{\"user\": 1, \"entity\": \"email\"}"; 

Map<String, List<String>> map2 = 
    mapper.readValue(
     jsonWithoutArray, 
     new TypeReference<HashMap<String, List<String>>>() {}); 

System.out.println(map2); // {user=[1], entity=[email]} 

這使您可以爲您的json中的值或單個元素提供一個數組。

+0

它可能不總是'列表''Map '正在爲我工​​作。 – user3306669

+0

@ user3306669 Map 將始終適用於任何JSON對象,因爲它是最一般的結構。但是,當您將它們從地圖中取出時,您必須投射這些值。這非常容易出錯,這就是我採用ACCEPT_SINGLE_VALUE_AS_ARRAY方法的原因。根據你的問題,我認爲這足以涵蓋所有可能的JSON。無論如何,我很高興你使用'Map '工作。從地圖中檢索值時要小心。 –

1

退房http://www.jsonschema2pojo.org/

它可以讓你的JSON自動轉換爲Java對象。當我需要從沒有Java映射或SDK的Web服務創建DTO時,我使用它。

+0

Map 爲我工作。 – user3306669

+0

這很好用,但我個人更喜歡不處理Object類,因爲它不是類型安全的。這就是爲什麼我建議這個資源,以便您可以將您的JSON轉換爲更具體的類。 – Maksim

+0

其實JSON輸入可以是任何類型。取決於輸入類型,一些操作將繼續。 – user3306669