【问题标题】:Spring - Java Map HashMap to Multi-Layer PojoSpring - Java 将 HashMap 映射到多层 Pojo
【发布时间】:2017-06-23 02:04:36
【问题描述】:

我有一个哈希映射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 级对象。

【问题讨论】:

  • 您是否试图避免手动构建对象?
  • 是的,我可以通过使用 switch case 来做到这一点,就像case "car.engine.make" then set it in the object 一样,但是如果我在地图中有很多价值,开关代码会变得很长
  • 没有切换案例,您只需构建一次映射类,直接通过字符串请求并将它们转储到正确的位置。除非您在地图中谈论超过 200 个字符串,否则这很可能是最有效的方法?另一方面,用hasmap以外的东西表示数据以更好地维护结构不是更好吗?或者这是不可能的?
  • 对于映射类,你有什么我可以参考的 URL,比如大致的方法吗?是的,不可能改变数据结构,它必须像我提到的那样。
  • 我将添加一个我为此示例编写的快速解决方案作为答案。

标签: java spring hashmap pojo


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我也意识到了这一点,但可惜我无法改变结构
  • 因此您必须解析哈希图并将值设置为颜色,引擎一一。
【解决方案2】:

您可以在 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);

【讨论】:

    【解决方案3】:

    在保持简单的同时完成这项工作的最简单方法是手动映射它们,如下所示。您可能需要考虑在进行过程中检查空值。

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

    【讨论】:

      【解决方案4】:

      使用类的一种方式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        相关资源
        最近更新 更多