2017-06-23 8 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クラスにマップする方法はありますか?私はjackson ObjectMapper mapper = new ObjectMapper();を使用しようとしましたが、1レベルのオブジェクトをマップできるようです。

+0

手動でオブジェクトを構築避けるためにしようとしていますか? –

+0

私はスイッチの場合を使用してそれを行うことができ、 'case" car.engine.makeのように "オブジェクトに設定します。"しかし、スイッチのコードは長くなります。マップに値がたくさんある場合 – hades

+0

スイッチなし場合によっては、マッピングクラスを一度構築し、文字列で直接要求し、適切な場所にダンプすることができます。あなたが地図上の200以上の文字列について話している場合を除き、最も効率的な方法です。もう一つの注意点として、構造をより良く開始するためにhasmap以外のものでデータを表現する方が良いのではないでしょうか?そうではありませんか? –

答えて

1

あなたVehicleクラスのコンストラクタに@JsonCreator annotationを使用することもできます。

@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

あなたはjacksonでPOJOにハッシュマップをマップする場合は、構造をリファクタリングする必要があります。

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

または、彼はハッシュマップを作成し、各classを手作業で構築する。

+0

うん、それも実現しましたが、あまりにも悪いですが、 – hades

+0

の構造を変更することはできませんので、ハッシュマップを解析し、値をエンジン、色ごとに設定する必要があります。 –

1

これを簡単に保ちながら、これを行うには、次のように手動でマップするのが最も簡単な方法です。必要に応じて、オプションの値をチェックするnullを検討することができます。

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