Преобразование карты в JSON на Java

#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

  1. Использование API Джексона
  2. Использование API Gson
  3. Использование 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);