[英]JSON to hashmap (Jackson)
我想用傑克遜將JSON轉換為HashMap。 這是我的JSON:
String json = "[{\"Opleidingen\":[{\"name\":\"Bijz. trajecten zorg en welzijn\",\"afk\":\"BTZW\",\"id\":\"0\"},{\"name\":\"Bouwkunde\",\"afk\":\"Bwk\",\"id\":\"14\"},{\"name\":\"Electrotechniek / mechatronica\",\"afk\":\"EltMe\",\"id\":\"15\"},{\"name\":\"Extern\",\"afk\":\"Extern\",\"id\":\"16\"},{\"name\":\"Gezondheidszorg\",\"afk\":\"Zorg\",\"id\":\"17\"},{\"name\":\"Handel\",\"afk\":\"Hand\",\"id\":\"18\"},{\"name\":\"Horeca\",\"afk\":\"Hor\",\"id\":\"19\"},{\"name\":\"Ict\",\"afk\":\"ICT\",\"id\":\"20\"},{\"name\":\"Maatschappelijke zorg\",\"afk\":\"MZ\",\"id\":\"21\"},{\"name\":\"Onderwijs assistent / pedagogisch werk\",\"afk\":\"OAPW\",\"id\":\"22\"},{\"name\":\"Tab / brug\",\"afk\":\"TAB\",\"id\":\"23\"},{\"name\":\"Werktuigbouw / maritieme techniek\",\"afk\":\"WtbMt\",\"id\":\"24\"},{\"name\":\"Zakelijke dienstverlening\",\"afk\":\"TAB\",\"id\":\"25\"}]},{\"Klassen\":[{\"name\":\"V2ZWA\",\"cat\":\"BTZW\",\"id\":\"1\"},{\"name\":\"V2ZWB\",\"cat\":\"Bwk\",\"id\":\"2\"},{\"name\":\"V2ZWB\",\"cat\":\"BTZW\",\"id\":\"3\"},{\"name\":\"V3B2A\",\"cat\":\"BTZW\",\"id\":\"3\"},{\"name\":\"V3B2B\",\"cat\":\"BTZW\",\"id\":\"4\"},{\"name\":\"V3B2C\",\"cat\":\"BTZW\",\"id\":\"5\"},{\"name\":\"V3B2D\",\"cat\":\"BTZW\",\"id\":\"6\"},{\"name\":\"V3B2E\",\"cat\":\"BTZW\",\"id\":\"7\"},{\"name\":\"V3B3A\",\"cat\":\"BTZW\",\"id\":\"8\"},{\"name\":\"V3B3B\",\"cat\":\"BTZW\",\"id\":\"9\"},{\"name\":\"V3B3C\",\"cat\":\"BTZW\",\"id\":\"10\"},{\"name\":\"VWA\",\"cat\":\"BTZW\",\"id\":\"11\"},{\"name\":\"VWB\",\"cat\":\"BTZW\",\"id\":\"12\"},{\"name\":\"VWC\",\"cat\":\"BTZW\",\"id\":\"13\"}]}]";
我希望我填寫我得到名字的ID,所以: result.get("13");
返回VWC
和result.get("0");
返回Bijz. trajecten zorg en welzijn
Bijz. trajecten zorg en welzijn
。
我試過這個:
try {
@SuppressWarnings("unchecked")
ArrayList<LinkedHashMap<?, ?>> result = new ObjectMapper().readValue(json, ArrayList.class);
System.out.println(result.get(1).get("id"));
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但那么這就是result.get(1);
的內容result.get(1);
:
I/System.out(809): {Klassen=[{name=V2ZWA, cat=BTZW, id=1}, {name=V2ZWB, cat=Bwk, id=2}, {name=V2ZWB, cat=BTZW, id=3}, {name=V3B2A, cat=BTZW, id=3}, {name=V3B2B, cat=BTZW, id=4}, {name=V3B2C, cat=BTZW, id=5}, {name=V3B2D, cat=BTZW, id=6}, {name=V3B2E, cat=BTZW, id=7}, {name=V3B3A, cat=BTZW, id=8}, {name=V3B3B, cat=BTZW, id=9}, {name=V3B3C, cat=BTZW, id=10}, {name=VWA, cat=BTZW, id=11}, {name=VWB, cat=BTZW, id=12}, {name=VWC, cat=BTZW, id=13}]}
我沒有傑克遜就試過了:
for (int i = 0; i < jObject.length(); i++) {
JSONArray opleidingen = jObject.getJSONObject(i).getJSONArray("Opleidingen");
for (int i2 = 0; i2 < opleidingen.length(); i2++) {
outMap.put(opleidingen.getJSONObject(i2).getString("id"), opleidingen.getJSONObject(i2).getString("name"));
}
JSONArray klassen = jObject.getJSONObject(i).getJSONArray("Klassen");
for (int i3 = 0; i3 < klassen.length(); i3++) {
outMap.put(klassen.getJSONObject(i3).getString("id"), klassen.getJSONObject(i3).getString("name"));
}
}
但這不起作用。
是否可以將我的JSON轉換為HashMap(當給出ID時它返回名稱)?
(可以在這里找到ArrayList類)
我認為,您應該將反序列化邏輯與最終檢索名稱的方式分開。 對於反序列化,盡可能使用simle方法。 例如,您可以創建描述JSON的POJO類。 見下面的例子。 POJO課程:
class EntitiesOwner {
private String name;
private List<Entity> entities;
@JsonAnySetter
public void setProperties(String name, List<Entity> entities) {
this.name = name;
this.entities = entities;
}
public String getName() {
return name;
}
public List<Entity> getEntities() {
return entities;
}
@Override
public String toString() {
return "EntitiesOwner [name=" + name + ", entities=" + entities + "]";
}
}
class Entity {
private int id;
private String afk;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAfk() {
return afk;
}
public void setAfk(String afk) {
this.afk = afk;
}
public void setCat(String cat) {
this.afk = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Entity [id=" + id + ", afk=" + afk + ", name=" + name + "]";
}
}
現在您可以通過這種方式輕松地反序列化它:
ObjectMapper mapper = new ObjectMapper();
EntitiesOwner[] owners = mapper.readValue(json, EntitiesOwner[].class);
System.out.println(Arrays.toString(owners));
以上程序打印:
[EntitiesOwner [name=Opleidingen, entities=[Entity [id=0, afk=BTZW, name=Bijz. trajecten zorg en welzijn], Entity [id=14, afk=Bwk, name=Bouwkunde], Entity [id=15, afk=EltMe, name=Electrotechniek / mechatronica], Entity [id=16, afk=Extern, name=Extern], Entity [id=17, afk=Zorg, name=Gezondheidszorg], Entity [id=18, afk=Hand, name=Handel], Entity [id=19, afk=Hor, name=Horeca], Entity [id=20, afk=ICT, name=Ict], Entity [id=21, afk=MZ, name=Maatschappelijke zorg], Entity [id=22, afk=OAPW, name=Onderwijs assistent / pedagogisch werk], Entity [id=23, afk=TAB, name=Tab / brug], Entity [id=24, afk=WtbMt, name=Werktuigbouw / maritieme techniek], Entity [id=25, afk=TAB, name=Zakelijke dienstverlening]]], EntitiesOwner [name=Klassen, entities=[Entity [id=1, afk=BTZW, name=V2ZWA], Entity [id=2, afk=Bwk, name=V2ZWB], Entity [id=3, afk=BTZW, name=V2ZWB], Entity [id=3, afk=BTZW, name=V3B2A], Entity [id=4, afk=BTZW, name=V3B2B], Entity [id=5, afk=BTZW, name=V3B2C], Entity [id=6, afk=BTZW, name=V3B2D], Entity [id=7, afk=BTZW, name=V3B2E], Entity [id=8, afk=BTZW, name=V3B3A], Entity [id=9, afk=BTZW, name=V3B3B], Entity [id=10, afk=BTZW, name=V3B3C], Entity [id=11, afk=BTZW, name=VWA], Entity [id=12, afk=BTZW, name=VWB], Entity [id=13, afk=BTZW, name=VWC]]]]
對於解析實體,我建議創建一個可以幫助你解決這個問題的新類。 例如:
class EntityResolver {
private Map<Integer, Entity> entities;
public EntityResolver(EntitiesOwner[] owners) {
entities = new HashMap<Integer, Entity>(owners.length);
for (EntitiesOwner owner : owners) {
for (Entity entity : owner.getEntities()) {
entities.put(entity.getId(), entity);
}
}
}
public Entity getById(int id) {
return entities.get(id);
}
}
用法簡單:
EntityResolver resolver = new EntityResolver(owners);
System.out.println(resolver.getById(0).getName());
System.out.println(resolver.getById(13).getName());
以上程序打印:
Bijz. trajecten zorg en welzijn
VWC
默認情況下,JSON中的列表映射到Java中的ArrayList。 可能有一種方法可以直接將列表反序列化為HashMap,但即使這樣,該方法也會非常復雜。 為什么不將JSON列表反序列化為ArrayList並進行一些后處理以獲取HashMap? 像這樣的東西:
public Map<Integer, String> listToMap(List<Object> list) {
Map<Integer, String> map = new HashMap<>();
for (Object obj : list) {
// you might want to try-catch all casts, some data might be invalid
Map<String, Object> elt = (Map<String, Object>) obj;
Integer id = (Integer) elt.get("id");
String name = (String) elt.get("name");
map.put(id, name);
}
return map;
}
編輯
我沒有明確說明如何獲取列表來提供上述方法。 在下面的代碼片段中,我使用了你在問題中聲明的字符串json
。 有關完整性,請參閱Jackson文檔中的原始數據綁定。
List<Object> inputData = new ObjectMapper().readValue(json, List.class);
Map<String, Object> inputMap = (Map<String, Object>) inputData.get(0);
List<Object> opleidingen = (List<Object>) inputMap.get("Opleidingen");
List<Object> klassen = (List<Object>) inputMap.get("Klassen");
Map<Integer, String> opleidingenMap = listToMap(opleidingen);
Map<Integer, String> klassenMap = listToMap(klassen);
現在您可以按照您描述的方式使用這兩個地圖:
opleidingenMap.get(25)
給
"Zakelijke dienstverlening"
請注意,這樣您就可以獲得opleidingen和klassen的單獨地圖。 如果您希望在一個地圖中包含所有元素,則可以制作如下地圖:
Map<Integer, String> fullMap = new HashMap<>();
fullMap.putAll(opleidingenMap);
fullMap.putAll(klassen);
請注意,這假設沒有與某些klas具有相同ID的opleiding。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.