Сериализация из 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());
}
}