Лучшие практики вложенного цикла - PullRequest
0 голосов
/ 11 октября 2018

Я читаю большой файл Json и хочу отобразить эти объекты в файле и вставить их в структуру db

Json

{

"A": [
    {
        "key1": "value1",
        "key2": "value2",
        "B": [
            {
                "id": "34f852c8-fc51-47aa-ba7f-dd659a4bff3f",
                "C": [
                    {
                        "c1": "819685-002",

                    }
                ]
            }
        ]
    },

    {
        "key1": "value1",
        "key2": "value2",
        "B": [
            {
                "id": "34f852c8-fc51-47aa-ba7f-dd659a4bff3f",
                "C": [
                    {
                        "c1": "819685-002",

                    }
                ]
            }
        ]
    }
]
}

Файл содержит несколько блоков A

Так что мне нужно зациклить три вложенных цикла

For (A){
    for (B){
       FOR (C) {
          // CREATE THE AN OBJECT 
       }
     }
 }

 // Then after the loop insert all objects once
 db.bulk(//List of object created);

Проблема вставки 2557 записи занимает 3 минуты?

Любое улучшение может быть сделано для улучшения процедуры зацикливания

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Похоже, это вопрос оптимизации. Очень похоже на это здесь .По сути, нет более эффективного способа оптимизации трех вложенных циклов for, однако анализ структуры вашего алгоритма и переоценка того, как вы назначаете свои объекты и анализируете сам JSON, была бы лучшей стратегией атаки.

При этом, как уже говорили другие, есть такие инструменты, как Джексон, которые сделают это для вас.

Вот несколько ссылок, которые помогут вам начать с этим:
Учебное пособие Дженкова для Jackson ObjectMapper
Учебное пособие по Баэльдунгу Учебник объектов Джексона
Учебное пособие по Mykong Jackson 2 для преобразования объекта Java в / из JSON

0 голосов
/ 11 октября 2018

Я бы всегда создавал модель для сопоставления строки json с POJO, чтобы у меня была гибкость в работе с ними.Например, для части вашего json я бы создал POJO как:

class Payload {
    private List<Result> A;

    // getters and setters
}


class Result {
    private String key1;
    private String key2;
    private List<Result2> B;

    // getters and setters
}

Теперь вы можете сопоставить свой json с pojo с Джексоном как:

import com.fasterxml.jackson.databind.ObjectMapper;
// . . . 
ObjectMapper mapper = new ObjectMapper();
Payload payload = mapper.readValue(jsonString, Payload.class);

Теперь вы можете отправитьполезная нагрузка или часть полезной нагрузки в дБ.

Если вы хотите использовать Gson для отображения, посмотрите на этот пример .

...