【问题标题】:How to make a list of maps with different datatypes in java?如何在java中制作具有不同数据类型的地图列表?
【发布时间】:2018-08-17 02:25:33
【问题描述】:

我对Java不是很好,所以请原谅我的无知。 我从一个表中选择并循环遍历结果集以创建一个列表,我可以使用该列表将其转换为 json,它应该类似于以下示例。

{
    "ContactId": "123",
    "key": {
        "type": "email",
        "email": "emailAdress"
    },
    "address": "String",
    "source": "String",
    "revoked": true,
    "text": "String"
}

我不知道如何将它们放入列表中,因为我需要将不同的数据类型放入哈希映射中。 请注意,在上面的示例中,键是一个对象,我试图在列表中实现相同的目标。 最终目标是将生成的列表转换为 json。

我创建了一些哈希图,但我认为我的做法不正确。

String Table = "TableName";
String sql = String.format("SELECT id_user, email FROM %s ", Table);
ResultSet res = dbConn.prepareStatement(sql).executeQuery();

Map<String, Map> keyObject = new HashMap<String, Map>();
Map<String, String> keyMap = new HashMap<String, String>();
Map<String, String> mainMap = new HashMap<String, String>();

List<Map<String, String>> contacts = new ArrayList<>();

int i = 0;
while(res.next()){
    keyMap.put("type", "email");
    keyMap.put("value", res.getString("email"));
    keyObject.put("key",  keyMap);
    mainMap.put("tenant", res.getString("id_user"));
    mainMap.put("purpose",  "Marketing sendouts");
    mainMap.put("legalBase",  "Withdrawn");
    contacts.add(i, map);
    i++;
}
System.out.println(contacts);

【问题讨论】:

  • 为什么不使用所需的成员类型创建Contact & Key 类,然后使用从数据库中检索到的记录创建List&lt;Contact&gt;,并将其序列化为 JSON 格式?或者,根据您使用的库,您可以创建通用 JsonObject。
  • 为什么不直接把数据放到JsonObject呢? JsonObject 可以像你需要的那样放置("key",Object)。
  • 快速浏览一下您的代码,我真的不认为地图是您应该使用的数据结构。例如,您确实了解每个键都是唯一的,当您执行 keyMap.put("value", res.getString("email")); 时,您正在用键“值”替换先前注册的值,不是吗?这看起来像是一个典型的案例,即不创建自己的数据结构,而是采用已经存在的东西,尽管事实完全不适合。
  • 这有点对象恐惧症的味道——简单地创建适当的类型并填充它们。通常,OO 语言中的列表映射列表表明您做错了......
  • @sakiM 不直接将其放入 JSON 对象的原因是我需要将列表分解为块或分区。我认为拥有列表会使数据分区变得容易。

标签: java arrays list arraylist hashmap


【解决方案1】:

与其使用ListMap 之类的通用结构,不如设计模拟所需结构的类。例如,在上述情况下,您可能会遇到如下情况:

public class Contact {
    private int contactId;
    private ContactKey key;
    private String address;
    private String source;
    private boolean revoked;
    private String text;
    // ....
}

现在这是一个强类型结构,可以很容易地从结果集中填充。像 Jackson(或许多其他工具)这样的工具可以轻松地将其呈现为 JSON。

【讨论】:

  • 我已经创建了这个类,但仍然不知道如何填充它,你能给我一个用法示例吗?
【解决方案2】:

创建一个模型类并使用它的 getter 和 setter 方法。

例如。

public class Model {

    private String id;

    private String name;

//Use constructor 
    public Model(String id, String name) { 

        this.id = id;

        this.name = name;

    }


    public String getId() {

        return id;

    }


    public void setId(String id) {

        this.id = id;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }

}


// Now make your Map data Structure center code hereustom .

Hashmap<String,Model> Map = new Hashmap();

// Create a object of your custom Model datastructure and add data.
Model model = new Model("145","Jason");
Map.put("1st",model);

请注意,所有数据都存储在 Map 的“1st”键中。

荣誉....享受

【讨论】:

    【解决方案3】:

    如果map是你首选的数据结构,你可以使用下面的代码:

        Map<String, Object> map = new HashMap<>();
        map.put("ContactId", 123);
    
        Map<String, Object> keyMap = new HashMap<>();
        keyMap.put("type", "email");
        keyMap.put("email", "emailAdress");
        map.put("key", keyMap);
    
        map.put("address", "aaaa");
    
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String json = objectMapper.writer().withDefaultPrettyPrinter().writeValueAsString(map);
            System.out.println(json);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    

    我假设 Jackson 是您用于序列化的库。

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2010-11-23
      • 2020-07-25
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多