2017-06-23 1 views
3

J'ai une carte de hachage Map<String, String> qui a valeur suivante, s'il vous plaît noter que le point indique la hiérarchie:Spring - Java Carte HashMap à multi-couche Pojo

+--------------------+-----------+ 
| Key    | Value | 
+--------------------+-----------+ 
| car.color   | blue  | 
| car.engine.make | mitsubishi| 
| car.engine.power | 120  | 
+--------------------+-----------+ 

J'ai des classes POJO:

public class Vehicle { 

    private Car car; 
    **Setters and Getters Below* 
}  

public class Car { 
    private String color; 

    private Engine engine; 
    **Setters and Getters Below*  
} 

public class Engine { 
    private String make; 

    private Integer power; 
    **Setters and Getters Below** 
} 

Est-il possible de mapper la HashMap dans la classe POJO en fonction de la hiérarchie? J'ai essayé d'utiliser jackson ObjectMapper mapper = new ObjectMapper(); mais il semble capable de cartographier 1 niveau d'objet.

+0

Vous essayez d'éviter la construction de l'objet manuellement? –

+0

Yup je peux le faire en utilisant le cas de commutation, et faire comme «affaire» car.engine.make «alors le mettre dans l'objet», mais les codes de commutateur deviendra long si j'ai beaucoup de valeur dans la carte – hades

+0

Dans certains cas, vous pouvez créer la classe de mappage une seule fois, en demandant directement par les chaînes et en les vidant au bon endroit. Ce sera probablement le moyen le plus efficace de le faire, sauf si vous parlez de plus de 200 chaînes sur la carte? Dans un autre ordre d'idée, ne serait-il pas préférable de représenter les données autrement que par un hasmap pour mieux maintenir la structure ou est-ce impossible? –

Répondre

1

Vous pouvez utiliser @JsonCreator annotation sur votre constructeur de la classe Vehicle:

@JsonCreator 
public Vehicle(Map<String, String> map) { 
    String color = map.get("car.color"); 
    String make = map.get("car.engine.make"); 
    Integer power = Integer.valueOf(map.get("car.engine.power")); 
    Engine engine = new Engine(); 
    engine.setMake(make); 
    engine.setPower(power); 
    Car car = new Car(); 
    car.setColor(color); 
    car.setEngine(engine); 
    this.car = car; 
} 

Utilisation:

Map<String, String> map = new HashMap<>(); 
map.put("car.color", "blue"); 
map.put("car.engine.make", "mitsubishi"); 
map.put("car.engine.power", "120"); 

ObjectMapper mapper = new ObjectMapper(); 

Vehicle vehicle = mapper.convertValue(map, Vehicle.class); 
1

Une des façons d'utiliser vos classes:

import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 

public class CarMap { 

    Map<String, String> maap = new HashMap<String, String>(); 

    public CarMap() { 
     Car c = new Car("blue", new Engine("mitsubishi",120)); 

     maap.put("color", c.color); 
     maap.put("make", c.engine.make); 
     maap.put("power",Integer.toString(c.engine.power)); 

     Set<String> keys = maap.keySet(); 
     for (String el : keys) { 
      System.out.println(el+"\t"+maap.get(el).toString()); 
     } 

     JSONObject obj = new JSONObject(); 

     JSONObject obj1 = new JSONObject(); 
     obj1.put("color",maap.get("color").toString()); 

     JSONArray engList = new JSONArray(); 
     JSONObject obj2 = new JSONObject(); 
     obj2.put("make",maap.get("make").toString()); 
     engList.add(obj2); 

     JSONObject obj3 = new JSONObject(); 
     obj3.put("power",maap.get("power").toString()); 
     engList.add(obj3); 

     obj.put("car", obj1); 
     obj.put("engine", engList); 
     System.out.print(obj); 
    } 

    public static void main(String[] args) { 
     new CarMap(); 
    } 


    class Car { 

     private String color; 
     private Engine engine; 

     Car(String c, Engine e) { 
      this.color = c; 
      this.engine = e; 
     } 
    } 

    class Engine { 

     private String make; 
     private Integer power; 

     Engine(String m, Integer p) { 
      this.make = m; 
      this.power = p; 
     } 
    } 
} 

SORTIE:

color blue 
power 120 
make mitsubishi 
{"car":{"color":"blue"},"engine":[{"make":"mitsubishi"}, "power":"120"}]} 
3

Si vous souhaitez mapper la hashmap en POJO avec jackson, vous devez factoriser la structure:

{ 
    "car": { 
    "color": "blue", 
    "engine": { 
     "make": "mitsubishi", 
     "power": 20 
    } 
    } 
} 

Ou, vous pouvez analyser Il hashmap et construit chaque class manuellement.

+0

Ouais j'ai réalisé cela aussi, mais tant pis je ne peux pas changer la structure si – hades

+0

alors vous devez analyser la hashmap et définir les valeurs à colorier, moteur un par un. –

1

La façon la plus simple de faire cela et de l'écarter tout en restant simple serait de les mapper manuellement comme suit. Vous pouvez envisager de ne pas vérifier les valeurs facultatives au fur et à mesure.

Map<String, String> map = *population here* 

Engine engine = new Engine() 
engine.setMake(map.get("car.engine.make")) 
engine.setPower(map.get("car.engine.power")) 

Car car = new Car(); 
car.setColor(map.get("car.color"); 
car.setEngine(engine); 

Vehicle vehicle = new Vehicle(); 
vehicle.setCar(car);