You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:41:03