Значение Kep всегда остается 0 при создании карты с использованием цикла for в Java - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь поместить Map<String, Object> в Map<String, Map<String, Object>>.

Ниже приведен код:

Map<String, Object> createmap = new HashMap<String, Object>();
Map<String, Object> result = new HashMap<String, Object>();

for (int j=0 ; j<jsonarr2.size(); j++ )
{
    JSONObject jsonobj2 = (JSONObject) jsonarr2.get(j);
    Iterator<String> key2 = jsonobj2.keySet().iterator();
    while (key2.hasNext()) {
        String k2 = key2.next();
        createmap.put(k2, jsonobj2.get(k2));    
    }
    System.out.println("Print J:" + j + " CREATE MAP:" + createmap);
    result.put(Integer.toString(j),createmap);
    System.out.println("result :" + result);
}

цикл For выполняется 5 раз и будет пять записейв createmap.Но карта result всегда использует ключ как 0 и, следовательно, на карте result доступна только последняя запись createmap.

Вывод оператора print внутри цикла:

Print J:0 CREATE MAP:{vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0001","timestamp":1548643752}}}}
result : {0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0001","timestamp":1548643752}}}}}
Print J:1 CREATE MAP:{vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0002","timestamp":1548643752}}}}
result : {0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0002","timestamp":1548643752}}}}}
Print J:2 CREATE MAP:{vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0003","timestamp":1548643752}}}}
result : {0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0003","timestamp":1548643752}}}}}
Print J:3 CREATE MAP:{vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0004","timestamp":1548643752}}}}
result : {0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0004","timestamp":1548643752}}}}}
Print J:4 CREATE MAP:{vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0005","timestamp":1548643752}}}}
result : {0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0005","timestamp":1548643752}}}}}

Но в конечном Map есть только

{0={vsan_name={"value":{"0":{"sequence":0,"value":"VSAN0005","timestamp":1548643752}}}}}

Ключ все время остается равным 0и значение обновляется до того же ключа.

1 Ответ

0 голосов
/ 30 января 2019

Похоже, jsonarr2.size() равно 1, и, следовательно, цикл запускается только один раз (хотя вложенный JSONObject имеет 5 ключей.

Кроме того, вы можете получать записи с одним и тем же ключом для разных объектов jsonиз массива json. Попробуйте переместить экземпляр createMap в цикл for, например:

Map<String, Object> result = new HashMap<String, Object>();

for (int j=0 ; j<jsonarr2.size(); j++ )
{
    Map<String, Object> createmap = new HashMap<String, Object>();
    JSONObject jsonobj2 = (JSONObject) jsonarr2.get(j);
    Iterator<String> key2 = jsonobj2.keySet().iterator();
    while (key2.hasNext()) {
        String k2 = key2.next();
        createmap.put(k2, jsonobj2.get(k2));    
    }
    System.out.println("Print J:" + j + " CREATE MAP:" + createmap);
    result.put(Integer.toString(j),createmap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...