【问题标题】:Jackson: parse json to Map<String, Object> for given Map<String, Class<?>>杰克逊:为给定的 Map<String, Class<?>> 将 json 解析为 Map<String, Object>
【发布时间】:2020-05-20 10:20:51
【问题描述】:

我得到了一个配置的 jackson 的 ObjectMapper 实例,其中应用了一些模块、反序列化器和配置。

我还有一个“平面”json,这意味着要么没有内部节点,要么ObjectMapper 能够将内部节点解析为单个对象。

我想将给定的 json 解析为 Map&lt;String, Object&gt;(属性名称 - 反序列化对象)。每个 json 属性名称的预期类是已知的,所以我可以将它们传递为 Map&lt;String, Class&lt;?&gt;&gt;。我如何归档该目标?

这就像用jackson.reader().fotType(Pojo.class).readValue() 解析到pojo,然后用反射收集pojo 字段。但我想避免提取 pojo 的类,避免使用反射并获得仅存在于 json 属性中的结果 Map。

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    受Convert JsonNode into POJO启发的解决方案:

    1. 将 json 解析为树
    2. 通过 treeToValue 将树子节点转换为预期的 java 对象

    片段:

    public Map<String, Object> decode(String json, Map<String, Class<?>> propertyClasses) throws JsonProcessingException {
      final HashMap<String, Object> parsedFields = new HashMap<>();
      final Iterator<Map.Entry<String, JsonNode>> jsonNodes = jacksonReader.readTree(json).fields();
      while (jsonNodes.hasNext()) {
        final Map.Entry<String, JsonNode> jsonEntry = jsonNodes.next();
        final String propertyName = jsonEntry.getKey();
        final Class<?> propertyClass = propertyClasses.get(propertyName);
        final Object parsedField = jacksonReader.treeToValue(jsonEntry.getValue(), propertyClass);
        parsedFields.put(propertyName, parsedField);
      }
      return parsedFields;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2014-01-29
      • 1970-01-01
      • 2015-11-21
      • 2012-12-04
      相关资源
      最近更新 更多