Сериализация из json в hashmap

Доброго времени суток нужна ваша помощь , не могу разобраться с сериализацией из json в hashmap , в классе AddressBook есть метод fromJsonToMap который не работает , ошибка формата com.google.gson.JsonIOException: JSON document was not fully consumed но я не понимаю как ее устранить . Если проверить передаваемый файл то проблем с ним нет и скобки все закрываются . В классе Record модель данных. В классе AddressBook мапа в которую должны попасть данные public Map<Long, Record> records = new HashMap<>();

 public AddressBook fromJsonToMap(String json) {
    Gson gson = new GsonBuilder().setLenient().create();
    return gson.fromJson(json, AddressBook.class);

}

https://github.com/danisz118/hw10_pb/blob/master/src/com/company/AddressBook.java ссылка на класс AddressBook .


Ответы (1 шт):

Автор решения: Дмитрий

Ваш джейсон невалидный потому, что у вас после него огромное количество пустых строк. Либоо уберите их из исходного файла, либо измените метод так:

public AddressBook fromJsonToMap(String json) {
    Gson gson = new GsonBuilder().setLenient().create();
    return gson.fromJson(json.trim(), AddressBook.class);
}

Ну и замечания в комментарии по поводу расположения джейсон вполне актуальны. Это, как минимум странно)

А вот так должен выглядеть нормальный метод чтения файла:

public String fileReader() throws IOException {
    try (Stream<String> stream = Files.lines(Paths.get("file.json"), Charset.defaultCharset())) {
        return stream.collect(Collectors.joining("\r\n"));
    }
}

А теперь делаем небольшой рефакторинг))

import com.google.gson.Gson;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class AddressBook {
    
    private final static String FILE_NAME = "file.json";
    private final Gson GSON = new Gson();
    private Map<Long, Record> records = new HashMap<>();
    
    public Record addRecord(long id,String FIO, String bornDate, int numbers, String address, long timeCreateFields) 
            throws CloneNotSupportedException {
        records.put(id, new Record(id, FIO, bornDate, numbers, address, timeCreateFields));
        return getRecord(id);
    }
    
    public Record updateRecord(long id, String FIO, String bornDate, int numbers, String address) 
            throws CloneNotSupportedException {
        return addRecord(id, FIO, bornDate, numbers, address, 0);
    }
    
    public Record getRecord(long id) throws CloneNotSupportedException {
        return records.containsKey(id) ? (Record) records.get(id).clone() : null;
    }
    
    public void removeRecord(long id) {
        records.remove(id);
    }

    public Collection<Record> allRecords() {
        return records.values();
        // если по какой-то причине нужен имено лист
        //return records.values().stream().collect(Collectors.toList());
    }
    
    public void store() throws IOException {
        fileWriter(GSON.toJson(records));
    }
    
    public AddressBook read() throws IOException {
        this.records = GSON.fromJson(fileReader(), Map.class);
        return this;
    }

    private void fileWriter(String json) throws IOException {
        Files.write(Paths.get(FILE_NAME), json.getBytes());
    }
    
    private String fileReader() throws IOException {
        try (Stream<String> stream = Files.lines(Paths.get(FILE_NAME), Charset.defaultCharset())) {
            return stream.collect(Collectors.joining("\r\n"));
        }
    }
    
}

import java.io.IOException;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException, IOException {        
        AddressBook addressBook = new AddressBook();
        Date date = new Date();
        addressBook.addRecord(1L, "zach", "25.01.94", 063043, "ул. Ленина, 3", date.getTime());
        addressBook.addRecord(2L, "zsafda", "30.01.91", 0236, "ул. Ленина, 15", date.getTime());
        addressBook.addRecord(3L, "zasada", "25.01.45", 0145, "ул. Ленина, 63", date.getTime());
        addressBook.store();        
        AddressBook addressBook1 = addressBook.read();        
        System.out.println(addressBook1.allRecords());
    }
}
→ Ссылка