Как клонировать `com.faster xml .jackson.core.JsonParser` - PullRequest
1 голос
/ 04 мая 2020

Мне нужно проанализировать один и тот же поток json дважды, один раз, чтобы определить, скажем, длину массива в потоке json, и затем проанализировать объекты. Однако для начала есть только один экземпляр JsonParser. Есть ли способ, которым я могу клонировать это или создать копию этого, потому что, как только экземпляр используется для анализа, он не может быть повторно использован для повторного анализа того же потока json, очевидно. Заранее спасибо.

Пример:


   static class ResultEntitiesContainer {
     List<ResultEntity> resultEntities;
     // getter and setters available
   }

    void parseEntities(JsonParser parser) {
      // Need to extract number of entities. 
      int count=0;
      ObjectMapper om = new ObjectMapper();
      JsonNode node = om.readTree(parser);
      node = node.get("resultEntities");
      if (node.isArray()) {
        count = node.size();
      }

      // Need to parse the entities in the json node
      ResultEntitiesContainer rec = om.readValue(parser, ResultEntitiesContainer.class);

    }

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Этот ответ направлен на решение вопроса о клонировании JsonParser, предполагая, что это необходимо.

com.faster xml .jackson.core.JsonParser является опубликованной c аннотацией класс, и он не обеспечивает клон или подобный метод. Абстрактный класс может быть расширен за счет различных реализаций, которые автор JsonParser. java не контролирует. Точно так же не безопасно клонировать JsonParser в качестве аргумента void parseEntities(JsonParser parser);, поскольку автор parseEntities не может быть уверен, какая реализация используется и может ли она быть клонирована.

Однако, если вы (как автор из parseEntities) действительно имеют контроль над используемыми реализациями, тогда можно безопасно клонировать известные реализации (при условии, что это возможно). Поэтому, если вы знаете, какую конкретную c реализацию (или реализацию) JsonParser будет использовать ваш класс, вы можете попробовать клонировать конкретно эти известные реализации. Например, добавьте и внедрите один или несколько методов (при необходимости), таких как:

void parseEntities(MyJsonParser parser);

void parseEntities(MyOtherJsonParser parser);

Тогда возникает вопрос клонирования указанных c реализации JsonParser, которые используются. Например, если предположить, что MyJsonParser поддерживает клонирование, может быть допустимо следующее.

void parseEntities (MyJsonParser parser) {

MyJsonParser clonedParser = parser.clone (); // зависит от реализации

...

}

0 голосов
/ 04 мая 2020

Насколько я вижу, нет необходимости разбирать дважды. Просто разберите его один раз на объект типа ResultEntitiesContainer и сосчитайте элементы в списке, чтобы получить count. Вы можете изменить метод parseEntities следующим образом:

void parseEntities(JsonParser parser) {
   ObjectMapper om = new ObjectMapper();

   // Need to parse the entities in the json node
   ResultEntitiesContainer rec = om.readValue(parser, ResultEntitiesContainer.class);
   // Need to extract number of entities. 
   int count = rec.getResultEntities().size();   
}

В качестве альтернативы вы можете выполнить синтаксический анализ объекта ResultEntitiesContainer с узла json следующим образом:

ResultEntitiesContainer rec = om.treeToValue(node, ResultEntitiesContainer.class);

Примечание:

  • Пожалуйста, проверьте, если ResultEntitiesContainer должно быть static.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...