#java #json #spring #jackson
Вопрос:
Я мигрирую с узла на java и нахожу действительно трудным работать с JSON, у меня есть следующая структура карты:
{1=Terrain, 2=Tree, 3=Building}
Который мне нужно преобразовать в JSON, но с этим strcutre:
[{ id: 1, name: Terrain }, { id: 2, name: Tree }, { id: 3, name: Building }]
Как я могу этого достичь? Спасибо
Ответ №1:
Карта в Java такая же, как этот объект в Javascript:
var map = {}; map[1] = "Terrain"; map[2] = "Tree";
Это приведет к созданию того же json.
Теперь, чтобы устранить проблему в Java, вам нужно будет преобразовать карту в список объектов:
Maplt;Integer, Stringgt; originalMap = //your map with values Listlt;Structuregt; mappedList = originalMap.entrySet() .stream() .map(entry -gt; new Structure(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); //convert mappedList via jackson
Структура-это просто созданный мной класс, который соответствует идентификатору свойств и имени из json:
public class Structure { private int id; private String name; public Structure(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } }
Ответ №2:
Несколько API, доступных для преобразования карты в JSON
- Использование API Джексона
- Использование API Gson
- Использование org.json API
Для API Джексона
Для этого вам нужно добавить зависимости jakson в проект
lt;dependenciesgt; lt;dependencygt; lt;groupIdgt;com.fasterxml.jackson.corelt;/groupIdgt; lt;artifactIdgt;jackson-corelt;/artifactIdgt; lt;versiongt;2.9.8lt;/versiongt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;com.fasterxml.jackson.corelt;/groupIdgt; lt;artifactIdgt;jackson-databindlt;/artifactIdgt; lt;versiongt;2.9.8lt;/versiongt; lt;/dependencygt; lt;/dependenciesgt;
Пожалуйста, ознакомьтесь со следующей основной программой для разговора
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; public class ConvertJavaMapToJson { @Test public void convertMapToJson() { Maplt;String, Stringgt; elements = new HashMap(); elements.put("Key1", "Value1"); elements.put("Key2", "Value2"); elements.put("Key3", "Value3"); ObjectMapper objectMapper = new ObjectMapper(); try { String json = objectMapper.writeValueAsString(elements); System.out.println(json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
Для Gson
lt;dependenciesgt; lt;dependencygt; lt;groupIdgt;com.google.code.gsonlt;/groupIdgt; lt;artifactIdgt;gsonlt;/artifactIdgt; lt;versiongt;2.8.5lt;/versiongt; lt;/dependencygt; lt;/dependenciesgt; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.junit.jupiter.api.Test; import java.lang.reflect.Type; import java.util.HashMap; import java.util.SortedMap; import java.util.TreeMap; public class ConvertJavaMapToJson { @Test public void convertMapToJson() { SortedMaplt;String, Stringgt; elements = new TreeMap(); elements.put("Key1", "Value1"); elements.put("Key2", "Value2"); elements.put("Key3", "Value3"); Gson gson = new Gson(); Type gsonType = new TypeTokenlt;HashMapgt;(){}.getType(); String gsonString = gson.toJson(elements,gsonType); System.out.println(gsonString); } }
Для org.json
lt;dependenciesgt; lt;dependencygt; lt;groupIdgt;org.jsonlt;/groupIdgt; lt;artifactIdgt;jsonlt;/artifactIdgt; lt;versiongt;20180813lt;/versiongt; lt;/dependencygt; lt;/dependenciesgt; import org.json.JSONObject; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; public class ConvertJavaMapToJson { @Test public void convertMapToJson() { Maplt;String, Stringgt; elements = new HashMaplt;gt;(); elements.put("Key1", "Value1"); elements.put("Key2", "Value2"); elements.put("Key3", "Value3"); JSONObject json = new JSONObject(elements); System.out.println(json); } }
Ответ №3:
Предполагая , что ваша карта имеет тип Maplt;Integer,Stringgt;
, вы можете определить следующий класс:
public class IdName { private final int id; private final String name; public IdName(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } }
Затем вы захотите преобразовать свою карту в коллекцию IdName
s:
Listlt;IdNamegt; list = map.entrySet().stream() .map((e)-gt;new IdName(e.getKey(),e.getValue())) .collect(Collectors.toList());
а затем преобразуйте эту коллекцию в JSON. Пример с Джексоном:
String json = mapper.writeValueAsString(list);