首页 > 解决方案 > 在 Java 中解析 JSON 和数据操作

问题描述

我是 Java 的超级新手,我正在尝试解析 JSON 并将数据操作成最终的数据结构,如下所示。

我有这个模型:

public class StoreInfo {
    private String storeName;
    private String storeCode;
    private List<StoreLocations> locations = new ArrayList<>();
}

这是我通过调用 Redis 得到的 JSON 响应:

redisResult = "[{
   storeName: 'Walmart',
   storeCode: '0001',
   locations: [ [Object] ]
 },
 {
   displayName: 'Wegmans',
   storeCode: '0002',
   locations: [ [Object] ]
 }]"

当我调用 Redis 时,我使用 keyNamegroceryStores和 fieldName 1

我想要一个看起来像这样的结果数据结构:

groceryStores: { 1 : [
  {
    storeName: 'Walmart',
    storeCode: '0001',
    locations: [ [Object] ]
  },
  {
    displayName: 'Wegmans',
    storeCode: '0002',
    locations: [ [Object] ]
  }]

我在使用 Jackson 将初始 JSON 字符串解析为 type 时遇到了很多麻烦StoreInfo。当我尝试以下操作时,我从杰克逊那里得到一个例外:

StoreInfo[] storeInfoArray = objectMapper.readValue(redisResult, StoreInfo[].class);
  1. 我不明白如何创建StoreInfo对象数组。

  2. 然后,使用键和字段来创建我的最终数据结构。

我是 Java 的超级新手,我已经知道如何在 Javascript 中完成后半部分,但是如何在 Java 中完成呢?

// Assuming the JSON response has been parsed

function addResponse (response, key, field, data) {
    response[key] = {}
    response[key][field] = data
  return response
}

标签: javajsonparsingdata-structuresjackson

解决方案


最简单的选择是为 StoreInfo 创建一个包装类,即

class StoreInfoDTO {
   List<StoreInfo> storeInfoList;
   //getter and setters 

}

现在使用 ObjectMapper 作为:

StoreInfo[] storeInfoArray = objectMapper.readValue(redisResult, 
StoreInfoDTO.class).getStoreInfoList();

第 2 部分,设置响应值:

class ResponseDTO {
       @JsonProperty("groceryStores")
       Map<Integer, List<StoreInfo>> props;
      //getter and setters 
 }

现在使用它:

    ResponseDTO responseDTO = new ResponseDTO();
    GrosseryStores grosseryStores = new GrosseryStores();
    ArrayList<StoreInfo> storeInfos = new ArrayList<StoreInfo>();
    storeInfos.add(new StoreInfo("SN1","1234"));
    ArrayList<StoreInfo> storeInfos1 = new ArrayList<StoreInfo>();
    storeInfos1.add(new StoreInfo("SN2","1236"));
    Map<Integer, List<StoreInfo>> map = new HashMap<>();
    map.put(1,storeInfos);
    map.put(2,storeInfos1);
    responseDTO.setProps(map);

推荐阅读