簡體   English   中英

Spring - Java將HashMap映射到多層Pojo

[英]Spring - Java Map HashMap to Multi-Layer Pojo

我有一個具有以下值的哈希映射Map<String, String> ,請注意點表示層次結構:

+--------------------+-----------+
|    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級對象。

如果要使用jackson將hashmap映射到POJO,則必須重構結構:

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

或者,您可以解析hashmap並手動構造每個class

使用課程的方法之一:

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"}]}

在保持簡單的同時完成這項工作並避開方法的最簡單方法是手動映射這些,如下所示。 您可能希望在進行時考慮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);

您可以在Vehicle類的構造函數上使用@JsonCreator注釋

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM