簡體   English   中英

JSON到hashmap(傑克遜)

[英]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"); 返回VWCresult.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM