繁体   English   中英

Java Jackson:解析三级JSON动态对象结构

[英]Java Jackson: parse three level JSON dynamic object structure

我正在尝试使用Java Jackson ObjectMapper解析具有动态键的三级JSON对象结构。 我尝试了以下方法:

public class AssetsPushManifest {
    private Map<String, List<Asset>> manifest = new HashMap<>();

    public void addPushManifest(Resource manifestResource) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Map<String, Asset>> manifestData = mapper.readValue(manifestResource.getInputStream(), new TypeReference<Map<String, Map<String, Asset>>>() {});
        for (String requestedPathName : manifestData.keySet()) {
            if (!this.manifest.containsKey(requestedPathName)) {
                this.manifest.put(requestedPathName, new LinkedList());
            }
            List<Asset> requestedPath = this.manifest.get(requestedPathName);

            for (String servePath : manifestData.get(requestedPathName).keySet()) {
                Asset asset = manifestData.get(requestedPathName).get(servePath);
                asset.path = servePath;
                requestedPath.add(asset);
            }
        }

        ...
    }

    public class Asset {
        public String path;
        public String type;
        public Integer weight;
    }
}

要解析此:

{
  "theme/test-theme/index.html": {
    "theme/test-theme/somestyling.css": {
      "type": "document",
      "weight": 1
    }
  }
}

但这行不通,为什么呢? 级别太多了吗? (这里还是Java初学者)

最终目标是将上述几个JSON结构解析为Map>之类的结构,因此任何其他实现此目的的方法也都可以。

我将以另一种方式解决此问题:将json解析为地图:如果您给Jackson提供地图作为类型引用,它将把JSON反序列化为多级地图:

`Map<String, Object> manifestData = mapper.readValue(manifestResource.getInputStream(), Map.class);`

现在json解析障碍已经过去,通过查询地图构造Asset实例更加容易。 我可以通过向Asset类添加一个构造函数来做到这一点:

public Asset(Map<String, Object> manifestData) { 
    Map<String, Object> assetData = (Map<String, Object>)manifestData.values().iterator().next();  // get the single value of the map
    this.path = assetData.keySet().iterator().next();
    this.type = assetData.get("type"); 
    this.weight = assetData.get("weight");
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM