【问题标题】:Java Jackson: parse three level JSON dynamic object structureJava Jackson:解析三级 JSON 动态对象结构
【发布时间】:2018-04-06 15:37:56
【问题描述】:

我正在尝试使用 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 的结构>所以任何其他方法也可以。

【问题讨论】:

  • 输出是什么?
  • Asset 对象不能正确表示 JSON 文件
  • 是的,它有一个额外的属性,路径,这可能是原因吗?我想我可以只使用该类,即使它有一个额外的属性,然后从“父”键设置该属性。
  • @Guts 的目标只是像示例一样读取 x 数量的清单 JSON,并创建一个像 Map> 这样的对象结构,稍后将用于 HTTP2 服务器推送响应。当请求单个 HTML 页面时,它还应该将所有相关资源推送到同一连接中。但首先我需要从 Polymer 框架生成的格式(如示例 JSON)中读取清单

标签: java json jackson objectmapper


【解决方案1】:

我会以不同的方式解决这个问题:将 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");
} 

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多