构建Map<NameplateCatalogForOrder,List<Order>>不符合预期问题求助
问题
需要读取以下JSON并构建为Map<NameplateCatalogForOrder, List<Order>>:
{ "orders":[ { "order":[ { "OrderReference":{ "reference":68203486, "version":1 } }, { "OrderReference":{ "reference":68203487, "version":1 } } ], "nameplate":{ "id":"98ZZ", "label":"VEC" } } ] }
已定义相关实体类:
public class NamePlateOrder { public ArrayList<Orders> orders; @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Builder public static class NameplateCatalogForOrder { public String id; public String label; } @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Builder public static class Orders { public List<Order> order; // 作为Map的值存储 public NameplateCatalogForOrder nameplate; // 作为Map的键存储 } @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Builder public static class Order { @JsonProperty("OrderReference") public OrderReference orderReference; } @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Builder public static class OrderReference { public int reference; public int version; } }
尝试构建Map的代码如下:
NamePlateOrder models = om.readValue(sql2, NamePlateOrder.class); System.out.println("NNamePlateWithOrder " + models); Map<NamePlateOrder.NameplateCatalogForOrder, List<NamePlateOrder.Order>> nameplateListMap = new HashMap<>(); for(NamePlateOrder.Orders firstOrders : models.getOrders()){ NamePlateOrder.NameplateCatalogForOrder n1 = firstOrders.getNameplate(); List<NamePlateOrder.Order> ordersListForNamePlate = firstOrders.getOrder(); nameplateListMap.put(n1, ordersListForNamePlate); }
执行后输出不符合预期:Map的键n1打印为对象引用格式,期望输出能和原JSON中的nameplate内容一致。
解决思路
1. 重写NameplateCatalogForOrder的toString()方法
Java默认的toString()会输出类名+哈希码(即你看到的对象引用格式),要让打印时显示和JSON一致的内容,需要手动重写该类的toString():
@EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Builder public static class NameplateCatalogForOrder { public String id; public String label; @Override public String toString() { return "{\"id\":\"" + id + "\",\"label\":\"" + label + "\"}"; } }
如果要更灵活(比如后续字段变更无需修改拼接逻辑),可以用Jackson的ObjectMapper序列化对象为JSON字符串:
// 假设已初始化ObjectMapper实例om @Override public String toString() { try { return om.writeValueAsString(this); } catch (JsonProcessingException e) { return super.toString(); } }
2. 优化Map整体打印格式(可选)
如果希望整个Map的输出更接近JSON风格,不要直接打印Map对象,而是遍历键值对并格式化输出:
nameplateListMap.forEach((key, value) -> { try { System.out.printf("Key: %s, Value: %s%n", key, om.writeValueAsString(value)); } catch (JsonProcessingException e) { e.printStackTrace(); } });
这种方式能让值部分的List<Order>也输出标准JSON格式,而不是默认的集合对象引用。
3. 验证Map逻辑正确性
你已经用@EqualsAndHashCode注解为NameplateCatalogForOrder生成了基于id和label的哈希与相等判断逻辑,所以Map的键不会出现重复或匹配错误。可以通过以下方式验证:
// 取出键并打印属性值,确认与JSON一致 NamePlateOrder.NameplateCatalogForOrder key = nameplateListMap.keySet().iterator().next(); System.out.println("Key id: " + key.getId() + ", label: " + key.getLabel());
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

