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 classes:

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 class?我尝试使用 jackson ObjectMapper mapper = new ObjectMapper(); 但它似乎能够映射 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;
        }
    }
}

输出:

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

如果你想用jackson将hashmap映射到POJO中,你必须重构结构:

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

或者,您可以解析 hashmap 并手动构造每个 class

在保持简单的同时完成这项工作并避免妨碍的最简单方法是手动映射这些,如下所示。您可能需要考虑对可选值进行空检查。

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 class' 构造函数上使用 @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);