有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson:解析json以映射给定映射的<String,Object>,<String,Class<?>>

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

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

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

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


共 (1) 个答案

  1. # 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;
    }