2017-06-23 35 views
3

我有一個哈希表Map<String, String>已下面的值,請注意點表示層次:春天 - Java的地圖HashMap來多層POJO的

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

我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** 
} 

有沒有什麼辦法可以將HashMap映射到基於層次結構的POJO類中?我試圖用傑克遜ObjectMapper mapper = new ObjectMapper();,但它似乎能夠映射1級別的對象。

+0

你們是不是要避免手動建立的對象? –

+0

是的,我可以做到這一點,通過使用開關的情況下,並做'case「car.engine.make」然後將其設置在對象',但開關代碼將變得冗長,如果我有很多值在地圖 – hades

+0

沒有開關的情況下,您只需構建一次映射類,直接請求字符串並將它們轉儲到正確的位置即可。除非你在地圖上討論超過200個字符串,否則它很可能是最有效的方法嗎?在另一個說明中,用hasmap之外的其他方法表示數據是否更好,以便更好地維護該結構以開始或不可能? –

回答

1

你可以使用@JsonCreator annotationVehicle類的構造函數:

@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; 
} 

用法:

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

之一的方式來使用你的類:

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; 
     } 
    } 
} 

OUTPUT:

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

如果你想HashMap中成POJO與jackson地圖,你必須重構結構:

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

或者,你可以解析t他hashmap和手動構建每個class

+0

是的,我意識到這一點,但太糟糕了,我不能改變結構,雖然 – hades

+0

,所以你必須解析哈希表,並設置值顏色,引擎一個接一個。 –

1

最簡單的方法就是按照以下方法手動映射這些手動操作,以簡化手動操作並保持簡單。隨着您的進行,您可能會考慮對可選值進行空值檢查。

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);