Java |GSON |Добавить объекты JSON в существующий JSON-файл - PullRequest
0 голосов
/ 18 января 2019

В настоящее время я запустил своего рода дневниковый проект, чтобы научиться кодировать, который я пишу на Java. У проекта есть графический интерфейс, который я реализовал с помощью JavaFX.

Я хочу записать данные в файл JSON, который я ввожу в два текстовых поля и ползунок. Такая запись JSON должна выглядеть так:

{
    "2019-01-13": {
        "textfield1": "test1",
        "textfield2": "test2",
        "Slider": 2
    }
}

Я уже создал класс, в котором значения могут передаваться и извлекаться JSONWriter. Класс выглядит так:

public class Entry {
    private String date, textfield1, textfield2;
    private Integer slider;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getTextfield1() {
        return textfield1;
    }

    public void setTextfield1(String textfield1) {
        this.textfield1 = textfield1;
    }

    public String getTextfield2() {
        return textfield2;
    }

    public void setTextfield2(String textfield2) {
        this.textfield2 = textfield2;
    }

    public Integer getSlider() {
        return slider;
    }

    public void setSlider(Integer slider) {
        this.slider= slider;
    }
}

Код JSONWriter выглядит следующим образом:

void json() throws IOException {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    JsonWriter writer = new JsonWriter(new FileWriter("test.json",true));

    JsonParser parser = new JsonParser();
    Object obj = parser.parse(new FileReader("test.json"));

    JsonObject jsonObject = (JsonObject) obj;
    System.out.println(jsonObject);

    writer.beginObject();
    writer.name(entry.getDate());
        writer.beginObject();
        writer.name("textfield1").value(entry.getTextfield1());
        writer.name("textfield2").value(entry.getTextfield2());
        writer.name("Slider").value(entry.getSlider());
        writer.endObject();
    writer.endObject();
    writer.close();
}

Дата получена из средства выбора даты. Позже я хочу отфильтровать данные из файла Json по дате и перенести содержащие объекты (текстовое поле 1, textfiel2, слайдер) в соответствующие поля.

Если возможно, я также хотел бы попытаться перезаписать объекты даты. Это означает, что если запись даты уже существует, и я хочу что-то изменить в записях, ее следует заменить в файле JSON, чтобы я мог получить ее позже.

Если вы можете порекомендовать лучший тип памяти для такого рода приложений, я открыт для этого. Но это также должно быть совместимо с базами данных позже. Позже я хотел бы также заняться базами данных.

Пока что я понятия не имею, как это сделать, потому что я все еще в начале программирования. Я искал сообщения, которые могли бы охватить тему, но я не нашел ничего, что я понимаю.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы можете начать без JsonParser и JsonWriter и использовать fromJson(..) и toJson(..) Гсона, потому что ваш текущий формат Json легко отображается как карта входных POJO.

Создание некоторой сложной реализации с JsonParser & JsonWriter может быть более эффективным для больших объемов данных, но в этом месте вы уже должны были изучить, как все равно сохранить db.

POJO легко манипулировать, и впоследствии их можно легко перенести в db - например, если вы решите использовать технологию, подобную JPA, с небольшим количеством аннотаций.

См. Простой пример ниже:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    // Your current Json seems to be a map with date string as a key
    // Create a corresponding type for gson to deserialize to
    // correct generic types
    Type type = new TypeToken<Map<String, Entry>>() {}.getType();
    // Check this file name for your environment
    String fileName = "src/test/java/org/example/diary/test.json";
    Reader reader = new FileReader(new File(fileName));
    // Read the whole diary to memory as java objects 
    Map<String, Entry> diary = gson.fromJson(reader, type);
    // Modify one field
    diary.get("2019-01-13").setTextfield1("modified field");
    // Add a new date entry
    Entry e = new Entry();
    e.setDate("2019-01-14");
    e.setScale(3);
    e.setTextfield1("Dear Diary");
    e.setTextfield1("I met a ...");
    diary.put(e.getDate(), e);
    // Store the new diary contents. Note that this one does not overwrite the
    // original file but appends ".out.json" to file name to preserver the original
    FileWriter fw = new FileWriter(new File(fileName + ".out.json"));
    gson.toJson(diary, fw);
    fw.close();
}

Это должно привести к test.json.out.json как:

{
  "2019-01-13": {
    "textfield1": "modified field",
    "textfield2": "test2",
    "Slider": 2
  },
  "2019-01-14": {
    "date": "2019-01-14",
    "textfield1": "Dear Diary",
    "textfield2": "I met a ...",
    "Slider": 3
  }
}

Обратите внимание, что я также сделал небольшое предположение об этом:

// Just in case you meant to map "Slider" in Json as "scale" 
@SerializedName("Slider")
private Integer scale;
0 голосов
/ 18 января 2019

Я дам вам общие советы, чтобы вы могли углубиться.

Прежде всего, я рекомендую вам эту архитектуру, которая распространена в веб-приложениях или даже в настольных приложениях, чтобы получить интерфейсный слой отдельновнутреннего сервера:

  • Front-end (используйте Java Fx, если хотите).Учебное пособие: http://www.mastertheboss.com/jboss-frameworks/resteasy/rest-services-using-javafx-tutorial

  • Back-end (Java 1.8, Springboot, база данных MySQL).Пример: существует множество примеров и учебных пособий, использующих этот стек, я рекомендую блоги mykong или baeldung.

Внешний интерфейс будет связываться с сервером по HTTP-запросу через внутренний REST API, используяJSON или XML формат для обмена сообщениями.В реальной жизни есть физически разделенные, но просто создайте 2 разных java-проекта, выполняющихся на разных портах.

  1. Для серверной части просто следуйте учебному руководству, чтобы запустить и запустить сервер API REST.Настройка шаблона MVC: уровень контроллера, уровень службы, уровень репозитория, уровень модели, слои dto и т. Д. Для вашей конкретной модели я рекомендую следующее:

selected_date: Date

входные данные: карта строк

размер: целое число

В Front-end проекте с Java FX, просто используйте код, который вы уже написали, и добавьте немного CSS, если хотите.Используйте действия компонентов для вызова внутреннего REST API для создания, извлечения, обновления и удаления ваших данных из средства выбора даты или любой другой операции, которую вы хотите выполнить.

Вы преобразуете объекты Java в JSONПостоянно, я рекомендую вам использовать библиотеку Gson или библиотеку Джексона, которые делают это напрямую, и нет необходимости создавать JsonObject вручную.Если вы все еще хотите записать JSON в файл, преобразуйте объект java в строку (это строка с объектом, записанным в формате JSON), используя упомянутые библиотеки, а затем запишите эту строку в файл.Но я твердо верю, что если вы внедрите базу данных, будет больше практики.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...