Правильное сохранение\чтение Json

301
30 сентября 2017, 20:15

Впервые работаю с Json. Использую Gson(Google). Я реализовал интерфейсы для сериализации и десериализации по этому гайду и сделал преобразование нужного мне объекта в json формат. Если сохранять каждый по отдельности, то получается вот так -> http://joxi.ru/nAy8G71uYBzQO2. Вот класс:

public class JsonConfigManager implements JsonSerializer<MatcherManager.Matcher>, JsonDeserializer<MatcherManager.Matcher> {
   private final Functional functional;
   private Gson gson;
   public JsonConfigManager(Functional functional) {
       this.functional = functional;
   }
   public void init() {
       GsonBuilder builder = new GsonBuilder();
       builder.registerTypeAdapter(MatcherManager.Matcher.class, this);
       builder.setPrettyPrinting();
       builder.setVersion(1.0D);
       this.gson = builder.create();
   }
    private void saveDefaultConfig() {
    try {
        if (this.configFile.createNewFile()) {
            try (Writer writer = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(configFile), "UTF-8"))) {
                for (MatcherManager.Matcher matcher : functional.getMatcherManager().getMatchers()) { // getMatchers -> HashSet<>
                    this.gson.toJson(matcher, MatcherManager.Matcher.class, writer);
                }
            }
        }
    } catch (IOException ex) {
        functional.getController().showExceptionDialog(ex);
    }
}
@Override
public JsonElement serialize(MatcherManager.Matcher matcher, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject object = new JsonObject();
    object.addProperty("name", matcher.getName());
    String pattern = matcher.getPattern().pattern().replace(".*(", "").replace(").*", "");
    object.addProperty("pattern", pattern);
    object.addProperty("enable", matcher.isEnable());
    object.addProperty("notifyPM", matcher.isNotifyPrivateMessages());
    return object;
}
@Override
public MatcherManager.Matcher deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    JsonObject object = json.getAsJsonObject();
    String name = object.get("name").getAsString();
    String pattern = object.get("pattern").getAsString();
    MatcherManager.Matcher matcher = new MatcherManager.Matcher(name, pattern);
    matcher.setEnable(object.get("enable").getAsBoolean());
    matcher.setNotifyPrivateMessages(object.get("notifyPM").getAsBoolean());
    return matcher;
}

}

Мне нужно, чтобы данные из него сохранились примерное в таком формате -> http://joxi.ru/E2pgylZs9qNXxm, не получается это сделать. Как правильно это сделать? И как потом это правильно прочитать?

Answer 1

Нужного формата сохранения я добился так:

this.gson.toJson(functional.getMatcherManager().getMatchers(), HashSet.class, writer);

А правильно прочитал из файла так:

Type type = new TypeToken<HashSet<MatcherManager.Matcher>>() {}.getType();
HashSet<MatcherManager.Matcher> set = this.gson.fromJson(reader, type);

Слава документации!

READ ALSO
Получаю Null , когда в конструкторе передаю this

Получаю Null , когда в конструкторе передаю this

на первой строке конструктора получаю Null , с сообщением о том, что невозможно создать экземпляр классаЯ так полагаю, что в момент отработки...

207
Log4j2 не работает после деплоя tomcat 8

Log4j2 не работает после деплоя tomcat 8

Ситуация следующая: Для логирования использую log4j2 в связке с slf4jПроект деплою на tomcat8

253
Сохранение звука с google translate

Сохранение звука с google translate

В гугла есть апи для работы с переводчиком (https://translategoogle

213
Как изменить ресурсы класса

Как изменить ресурсы класса

У меня есть настройки в виде txt файла, этот txt файл будет находится в jar архиве

204