Чтобы добавить новые записи в существующий файл Json

Я пытаюсь сохранить проанализированные данные в файле JSON для дальнейшего продолжения. Не могли бы вы рассказать мне, как добавить новую информацию в существующий файл Json. Я собираюсь сохранить данные в следующем представлении:

{
"836" : {
              "announcGroup" : "Close",
              "onSiteFrom" : "Junie 2011",
              "phoneNumber" : "002325486584",
             }
}

и мне нужно

{
"836" : {
              "announcGroup" : "clothes",
              "onSiteFrom" : "Junie 2011",
              "phoneNumber" : "002325486584",
             },
"856" : {
              "announcGroup" : "clothes",
              "onSiteFrom" : "Junie 2011",
              "phoneNumber" : "002325486157",
             }
}

Мне нужно добавить новые проанализированные данные в JSONFile.

Сначала я поместил всю информацию в Map<String, Map<String, String>>

package WebPageProceeder;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import Helpers.CheckString;
import WebPages.ConfigProvider.ConfigProvider;
import org.jsoup.Connection;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.*;
import org.jsoup.select.Elements;

import static ExcelFileWriters.JSONWriter.writeMapToJSON;
import static ExcelFileWriters.WriteInExcel.writeToExcelTable;
import static Helpers.CutString.clearString;
import static Helpers.WriteToFile.writeInFile;

public class JSoupParser {

    public static Map<String, Map<String, String>> parseWebPage(String linkToParse) throws IOException {

        Map<String, Map<String, String>> mainMapWebSiteInfo = new HashMap<>();
        Map<String, String> webPageInfo = new HashMap<>();

        Connection.Response response = Jsoup.connect(linkToParse).followRedirects(false).execute();
        System.out.println(response.statusCode() + " : " + response.url());
        response.statusCode();

        if (response.statusCode() == 200 || response.statusCode() == 302) {

            System.out.printf("Link \" %s  \" is available\n ", response.url());
            try {
                Document doc = Jsoup.connect(linkToParse)
                        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0")
                        .get();
                Elements phoneNumber = doc.selectXpath("//*[@id=\"js-item-page\"]/div[1]/div[7]/div/div/dl[2]/dd/ul/li[1]/a");
                String phoneNumberValue = phoneNumber.attr("href");
                Elements onSiteFrom = doc.selectXpath("//*[@id=\"container\"]/div/section/aside/div[1]/div/dl/dd/span");
                String onSiteFromValue = onSiteFrom.text();
                Elements ownerName = doc.selectXpath("//*[@id=\"container\"]/div/section/aside/div[1]/div/dl/dd/a");
                String ownerNameValue = ownerName.text();
                

                webPageInfo.put("phoneNumber", clearString(phoneNumberValue, ':', 1));
                webPageInfo.put("onSiteFrom", clearString(onSiteFromValue,' ', 10));
                webPageInfo.put("announcGroup", announcGroupValue);
                writeInFile("C:\\GoodResults.txt",linkToParse);

                mainMapWebSiteInfo.put(clearString(linkToParse, '/',12), webPageInfo);

                writeMapToJSON(mainMapWebSiteInfo, ConfigProvider.jsonFoleForData);
            } catch (NullPointerException ex) {
                System.out.println("Announcement is not available 1");
                ex.printStackTrace();
            } catch (HttpStatusException ex) {
                System.out.println("Announcement is not available 2");
                // TODO To put the link is file with bad results
                writeInFile("C:\\BadResults.txt",linkToParse);
                System.out.println(ex.getMessage());
            } catch (IOException ex) {
                System.out.println("Announcement is not available 3");
                ex.printStackTrace();
            }
        } else {
            System.out.println("not possible to get page...");
            // TODO To put the link is file with unavailable results
            writeInFile("C:\\UnavailableResults.txt",linkToParse);
            System.out.println(response.statusMessage());
        }

        return mainMapWebSiteInfo;
    }
}

И затем я пытаюсь записать это в JSONFile:

package ExcelFileWriters;

import WebPages.ConfigProvider.ConfigProvider;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.mysql.cj.xdevapi.JsonValue;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

public class JSONWriter {

    public static void writeMapToJSON(Map<String, Map<String, String>> hasmap, String filePath){
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
        StringWriter out = new StringWriter();
        File file = new File(filePath);
        try {
            ObjectNode root = mapper.createObjectNode();
            ArrayNode parseddata = mapper.createArrayNode();
            if (!file.exists()){
                file.createNewFile();
                writeMapToJSON(hasmap, filePath);
            }else{
                writer.writeValue(file, hasmap);
            }    

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


}

Но каждый раз получаю новый файл с новыми данными.

Или может кто-нибудь предложить более эффективный способ хранения информации, чтобы с ней можно было работать и обрабатывать позже?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это может помочь вам. Попробуйте добавить содержимое из файла на карту, затем объединить две карты и записать полную карту в файл:

    public class JSONWriter {
    
        public static void writeMapToJSON(Map<String, Map<String, String>> hasmap, String filePath){
            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(SerializationFeature.INDENT_OUTPUT);
            ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
            File file = new File(filePath);
            try {
    
                if (!file.exists()){
                    file.createNewFile();
                    writeMapToJSON(hasmap, filePath);
                }else{
                    Map<String, Map<String, String>> existingJSONContent = readJsonFile(ConfigProvider.jsonFoleForData);
                    existingJSONContent.putAll(hasmap);
                    writer.writeValue(file, existingJSONContent);
                }
    
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

 public static Map<String, Map<String, String>> readJsonFile(String fileName){
        ObjectMapper mapper = new ObjectMapper();
        try{
            return mapper.readValue(new File(ConfigProvider.jsonFoleForData), Map.class);
        }catch(IOException ex){
            ex.printStackTrace();
            return new HashMap<>();
        }
    }
    
    
    }

Другие вопросы по теме