【问题标题】:Parsing JSON in Java and data manipulation在 Java 中解析 JSON 和数据操作
【发布时间】:2020-03-01 20:19:14
【问题描述】:

我是 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 时,我使用 keyName groceryStores 和 fieldName 1

我想要一个如下所示的数据结构:

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

我在使用 Jackson 将初始 JSON 字符串解析为 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
}

【问题讨论】:

    标签: java json parsing data-structures jackson


    【解决方案1】:

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

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

    现在使用 ObjectMapper 作为:

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

    第二部分,设置响应值:

    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);
    

    【讨论】:

    • 感谢您的回复!第一部分对我来说很有意义。但是,对于第 2 部分,我需要一个允许我设置任何键或字段的实现,而不仅仅是 groceryStores1。我将使用许多不同类型的商店调用我的缓存,并希望将响应组合成一个大哈希。我想我可以通过将键和字段的值传递给函数并以这种方式设置它们来类似于我完成 JS 示例的方式来做到这一点
    • 嘿..根据您的评论,我已经更新了响应对象。现在您应该可以使用动态键了。最初,我假设您正在寻找“1”作为键。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多