首页 > 解决方案 > 解析来自以 id 作为字段名称的 REST API 的 json 响应

问题描述

我想解析 json 字符串并形成一个 pojo 对象,但响应有些不寻常。我有来自 API 的以下类型的响应

  "data": {
          "12": {
             "value": "$0.00",
             "order_id": "12",
             "order_date": "2020-08-26 15:50:05",
             "category_name": "Games",
             "brand_id": "4",
             "denomination_name": "AED 50",
             "order_quantity": "1",
             "vendor_order_id": "A-123",
             "vendor_location": "",
             "vouchers": {
                "804873": {
                   "pin_code": "41110AE",
                   "serial_number": "fddfgfgf1234444"
                }
             }
          },
          "15": {
             "value": "$0.00",
             "order_id": "15",
             "order_date": "2020-08-26 08:39:11",
             "category_name": "Games",
             "brand_id": "52",
             "brand_name": "PlayStation",
             "denomination_name": "$20",
             "order_quantity": "1",
             "vendor_order_id": "A-316",
             "vendor_location": "",
             "vouchers": {
                "806328": {
                   "pin_code": "fdfd",
                   "serial_number": "fawwwww"
                }
             }
          }
    }
    }

由于内部数据字段名称与凭证相同,我如何解析此响应

标签: javajsongson

解决方案


如果您使用 Jackson JSON 库,您应该具有如下所示的 POJO,并用于PropertyNamingStrategy.SnakeCaseStrategy处理输入 JSON 中的属性名称:

// top-level container
public class Response {
    private Map<Integer, Order> data;
    // getter/setter
}

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Order {
    private String value; // may be some Currency class
    private Integer orderId;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime orderDate;

    private String categoryName;
    private Integer brandId;
    private String brandName;
    private String denominationName; // may be Currency too
    private Integer orderQuantity;
    private String vendorOrderId;
    private String vendorLocation;
    private Map<Integer, Voucher> vouchers;

    // getters/setters
}

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Voucher {
    private String pinCode;
    private String serialNumber;
    
    // getters/setters
}

推荐阅读