Nano Hash - криптовалюты, майнинг, программирование

Чтение нескольких объектов JSON из текстового файла

Мой вопрос аналогичен тому, что было задано здесь. несколько моментов:

  1. Не могу изменить формат. (запятые не ставить и т.д.)
  2. По сути, это огромный файл .txt, содержащий тысячи объектов Json.
  3. Мои объекты Json ОГРОМНЫ.

Вот что я делаю прямо сейчас:

    FileReader fileReader = new FileReader(fileName);
        BufferedReader reader = new BufferedReader(fileReader);
        String data = "";
        while((data = reader.readLine()) != null){
            ObjectMapper mapper = new ObjectMapper();
            Map<String,String> map = mapper.readValue(data, Map.class);
        }

В настоящее время я использую Джексона, и в идеале я хотел бы читать один объект Json из файла за раз, анализировать его и затем переходить к следующему. Мне нужно подсчитать, скажем, уникальное количество идентификаторов из этого объекта Json и выполнить больше операций. Лучше всего читать их по очереди.

Джексон был бы лучшим способом двигаться вперед? Это хороший пример анализа огромный Json, но он имеет дело только с одним объектом в файле. В моем файле огромные Jsons (их 1000).

07.08.2015

  • В: Пробовали ли вы парсить JSON с помощью Jackson Streaming API (по вашей ссылке)? Вы уверены, что он не может обрабатывать несколько объектов JSON в одном файле? 07.08.2015
  • Я пытался сделать то же самое, что и в Эта ссылка. Он анализирует только первый объект json и останавливается. 07.08.2015
  • Парсер принимает InputStream или Reader в качестве параметра? В этом случае возможно зацикливание объектов чтения до тех пор, пока InputStream не достигнет EOF (проверьте available). 07.08.2015
  • Это может сработать. У него есть читатель. Теперь он выполняет итерацию по различным объектам, но он испортил вложенные объекты внутри. Я постараюсь исправить это и посмотреть, работает ли это. Спасибо. 07.08.2015
  • Если вы хотите использовать Джексона, почему вы отметили этот вопрос Гсоном? 07.08.2015
  • Я раньше не пользовался Джексоном или Гсоном. Я не был уверен, что Джексон будет правильным путем. Поэтому я хотел выяснить, если не Джексон, то какой подход лучше всего использовать с Гсоном (если таковой имеется). Похоже, у них есть некоторый API для анализа огромных данных, но я хочу использовать смешанный подход между потоком и отображением. 08.08.2015
  • Вопрос: Вы поняли это? Вопрос. Действительно ли файл содержит несколько различных объектов JSON верхнего уровня? В: Является ли синтаксический анализ нескольких объектов/файлов JSON основной проблемой? 08.08.2015
  • Да, подход, предложенный KDM, кажется, работает, я еще не реализовал его решение, чтобы полностью удовлетворить мои требования. Да, тысячи разных объектов Json, но их схема одинакова. Основная проблема заключается в том, что мне нужно запрашивать эти объекты, такие как подсчет уникальных пользователей, подсчет общих свойств пользователей и т. д. Но поскольку файл настолько огромен, я не могу загрузить его в память, мне нужно проанализировать каждый элемент и получить данные, относящиеся к меня и создайте магазин key-value, чтобы использовать его позже. 08.08.2015

Ответы:


1

Вот пример Джексона, который работает для меня. У меня есть тысячи объектов json (токенов) в одном файле json. Этот код будет перебирать файл, читать каждый токен и печатать его серийный номер.

Требуемый импорт:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;

Использование Джексона для чтения нескольких объектов json из FileInputStream:

try (FileInputStream fis = new FileInputStream("D:/temp/tokens.json")) {
        JsonFactory jf = new JsonFactory();
        JsonParser jp = jf.createParser(fis);
        jp.setCodec(new ObjectMapper());
        jp.nextToken();
        while (jp.hasCurrentToken()) {
            Token token = jp.readValueAs(Token.class);
            jp.nextToken();
            System.out.println("Token serial "+token.getSerialNumber());
        }
    }
23.05.2016

2

Вот более похожее на JAVA решение для вашего запроса, я всегда склоняюсь к BufferedReader, а не к InputStreams для любого места, где синтаксический анализ будет выполняться много времени.

 ObjectMapper mapper  = new ObjectMapper();
 JsonFactory jsonFactory = new JsonFactory();
 try(BufferedReader br = new BufferedReader(new FileReader("luser.txt"))) {
     Iterator<luser> value = mapper.readValues( jsonFactory.createParser(br), luser.class);
     value.forEachRemaining((u)->{System.out.println(u);});
 }

Десериализация для каждого объекта происходит как часть next() на каждой итерации.

07.06.2017

3

Вот как я использовал JSONReader API для обработки требований, аналогичных указанным выше.

public static List<YOURPOJO> readTraceLog(String filepath) throws IOException {

         Gson gson = new Gson();
         JsonReader jsonReader = new JsonReader(new FileReader(filepath));
         // important as handles unwanted formatting stuffs such empty spaces 
        jsonReader.setLenient(true);

        boolean start = true; // start of read
        jsonReader.beginObject(); // first object begins
        //List to hold object 
        List<YOURPOJO> completeList = new ArrayList<YOURPOJO>();
        //YOURPOJO has two attributes one is ID and other is list of ANOTHERPOJO

        while (jsonReader.hasNext()) {
            if (!start) {
                //to stop end of Document
                if (jsonReader.peek().toString().matches("END_DOCUMENT")) {
                    break;
                }
                //continue reading object as the come -{
                jsonReader.beginObject();

            }
            start = false;
            YOURPOJO pojo = new YOURPOJO();
            //read attribute id
            String name = jsonReader.nextName();
            pojo.setId(name);

            //list to store ANOTHERPOJO objects
            List<ANOTHERPOJO> tempList = new ArrayList<ANOTHERPOJO>();

            //begin reading list - [
            jsonReader.beginArray();
            while (jsonReader.hasNext()) {
                ANOTHERPOJO t = gson.fromJson(jsonReader, ANOTHERPOJO.class);
                tempList.add(t);
            }
            //end reading list - ]
            jsonReader.endArray();

            //store data
            pojo.setTraceDetails(tempList);
            completeList.add(YOURPOJO);

            //end of object  - }
            jsonReader.endObject();

        }

        jsonReader.close();
        return completeList;
    }
01.02.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..