Как разобрать json с помощью универсальной функции?

#java

#java

Вопрос:

Я хочу написать универсальную функцию для анализа строки json (stringEtcdContent ниже в коде). Строка содержит список объектов с ключом «значение». Я анализирую json в дерево, получаю список JsonNode (valueNodes ниже) со строкой для анализа с использованием универсального класса. Класс, в котором у меня есть функция, таков: «общедоступный абстрактный класс DashboardReportProvider». Основываясь на аналогичном вопросе здесь, я написал эту функцию:

   @SuppressWarnings("unchecked")
  public List<T> getStatusList(String path) {
    Class<T> clazz;
    clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    List<T> statusList = new ArrayList<>();
    T statusItem;
    ObjectMapper mapper = new ObjectMapper();
    try {
      String stringEtcdContent = etcdCommandExecutor.getEtcdValue(path);
      JsonParser parser=new MappingJsonFactory().createParser(stringEtcdContent);
      JsonNode rootNode=parser.readValueAsTree();
      List<JsonNode> valueNodes=rootNode.findValues("value");
      Iterator<JsonNode> valueNodesIterator=valueNodes.listIterator();
      while (valueNodesIterator.hasNext()) {
        JsonNode valueNode=(JsonNode)valueNodesIterator.next();
        ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
        String valueString = writer.writeValueAsString(valueNode);
        statusItem = mapper.readValue(valueString, clazz);
        statusList.add(statusItem);
      }
      return statusList;
    } catch (Exception e) {
      LOG.error(e.getMessage());
    }
    return statusList;
  }
 

Он компилируется нормально, но когда я пытаюсь запустить код, я получаю эту ошибку:
«[ОШИБКА] java.lang.Класс не может быть приведен к java.lang.reflect.ParameterizedType «. Что не так?

Комментарии:

1. Класс — это объект, который реализует несколько интерфейсов, включая тип интерфейса. Вы пытаетесь преобразовать ParameterizedType в Class

2. Однако ParameterizedType не расширяет все те же интерфейсы, что и реализации класса, следовательно, это приведение невозможно

Ответ №1:

Попробуйте ObjectMapper ,

 new ObjectMapper().readValue(path,Object.class);
 

где Object.class — приведение к типу