2016-10-10 4 views
1

Я пытаюсь выполнить итерацию через хэш-карту и создать строку json из значений. Для этого я использую библиотеку JSONSimple. У меня есть структура, которую я хочу, но значения переписываются. Структура, в которой я заканчиваю, -JSONSimple Overwriting

{ 
    "new_id":{ 
     "coordinates_list":{ 
     "Coordinates: ":[ 
      "lat: 27.0", 
      "lon: 28.0" 
     ] 
     }, 
     "t0vhf40cv86t":[ 
     "123" 
     ] 
    } 
} 

Но в JSON должны быть дополнительные значения. Включается только последняя строка хэш-карты. Нужно ли мне добавить еще один JSONObject, который я пишу?

JSONObject obj = new JSONObject(); // final json object written out 

    double lat = 20.00; // test data 
    double lon = 21.00; // test data 
    for (Map.Entry<String, List<String>> entry : data.entrySet()){ 
     JSONObject childObj = new JSONObject(); 
     JSONObject coordObj = new JSONObject(); 

     JSONArray entities = new JSONArray(); 
     JSONArray coordinates = new JSONArray(); 

     String key = entry.getKey(); 
     List<String> values = data.get(key); 
     for(String value : values){ 
      entities.add(value); 
     } 
     childObj.put(key,entities); 

     // increments the test data 
     lat = lat +1; 
     lon = lon + 1; 

     coordinates.add("lat: " + lat); 
     coordinates.add("lon: " + lon); 

     coordObj.put("Coordinates: " ,coordinates); 

     childObj.put("coordinate list ", coordObj); 

     obj.put("new_id" , childObj); 

    } 
+0

Почему вы делаете 'List values ​​= data.get (key)', не должен ли он быть? List values ​​= entry.getValue() '? –

ответ

2

Вы всегда используете «new_id» в качестве ключа на строке «obj.put». Для первой записи карты вы устанавливаете значение для этого ключа в объекте JSON. Для каждой последующей записи вы заменяете значение этого ключа, а не добавляете новый ключ. Вот почему в JSON представлена ​​только последняя запись на карте.

Я не уверен, что вы пытаетесь выполнить, но вам, вероятно, придется каждый раз использовать один ключ в цикле или использовать JSONArray вместо JSONObject, чтобы вам не нужны клавиши в все.

+0

Наверх-проголосовали за то, что вы правильно ответили, но документация 'put()' может лучше объяснить ситуацию: «' put (String name, Object value) '- Maps' name' to 'value', clobbering any existing сопоставление имен и значений с тем же именем. " –

+0

@ JonnyHenly спасибо, я этого не знал. Какова процедура, если я хочу создать что-то, что всегда будет одинаковым? Скажем, я хочу добавить «Тип»: «Функция» к каждому элементу. Разве это невозможно? – rvisio

+0

Если вы не хотите добавлять это поле в свои классы, то вы, вероятно, захотите сделать что-то вроде этого [http://stackoverflow.com/questions/14714328/jackson-how-to-add-custom-property -в-заместитель JSON-без-модифицирующего-на-POJO). –