Я пытаюсь получить входную информацию пользователя, сохранить ее в файле JSON, а затем иметь возможность вводить дополнительную информацию при другом запуске, не перезаписывая весь файл. Идея состоит в том, что он будет работать как база данных учетных записей.
Хотя мой код включает в себя гораздо больше, чем этот фрагмент, по сути это то, что мне нужно. Кроме того, я использую IntelliJ IDEA в качестве своей IDE.
public static void accountSetup() throws IOException {
// Variables
File accounts = new File("accounts.json");
ObjectMapper mapper = new ObjectMapper();
ArrayNode arNode = mapper.createArrayNode();
ObjectNode obNode = mapper.createObjectNode();
Scanner scan = new Scanner(System.in);
// Get user info
System.out.println("What is the account holder's name?");
obNode.put("name",scan.nextLine());
System.out.println("Please enter a 7-digit passcode");
obNode.put("passcode",scan.nextInt());
// Write to JSON file
mapper.enable(SerializationFeature.INDENT_OUTPUT);
arNode.add(obNode);
mapper.writeValue(accounts,arNode);
}
Вот что я ожидаю от этого фрагмента (^), предполагая, что пользователь ввел «Сэм» и «1234567», а затем перезапустил программу и ввел «Макс» и «7654321»:
[
{
"name" : "Sam",
"passcode" : 1234567
},
{
"name" : "Max",
"passcode" : 7654321
}
]
Однако когда я пытаюсь запустить программу еще раз и ввести другую информацию, она полностью перезаписывает файл, оставляя мне следующее:
[
{
"name" : "Max",
"passcode" : 7654321
}
]
Я понимаю, что это как-то связано с тем, как ObjectMapper записывает в файл, и я немало покопался, но безрезультатно.
Я хотел бы продолжать использовать Jackson, поскольку он кажется мощным и надежным инструментом, когда дело доходит до JSON, и я начал проект, для которого он был предназначен, как средство изучения различных аспектов Java. Другими словами, я бы хотел оставить переключение библиотек на крайний случай.
Пожалуйста, имейте в виду, что я в лучшем случае едва начинающий программист, и некоторые вещи, которые могут показаться глупыми или очевидными, не для меня.
TL;DR По сути, я пытаюсь добавить ObjectNode в массив JSON между средами выполнения... и не могу этого понять. Будем очень благодарны любой помощи. Спасибо за ваше время.
Я проверил ваш код и обнаружил, что вы неправильно читаете файл.
@ SedJ601 Не могли бы вы пояснить, что это значит? Я предполагаю, что это как-то связано с файлом account = new File("accounts.json");




Я впервые использую Jackson, так что, возможно, есть способ получше. Я также вижу, что вы используете устаревшие методы. Это нехорошо.
Попробуйте делать все по порядку.
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Scanner;
/**
*
* @author Sed
*/
public class JavaTestingTwo {
public static void main(String[] args)
{
try
{
File accounts = new File("accounts.json");
String jsonString = Files.readString(accounts.toPath());
ObjectMapper objectMapper = new ObjectMapper();
ArrayNode arNode = objectMapper.createArrayNode();
JsonNode arrayNode = objectMapper.readTree(jsonString);
if (arrayNode.isArray()) {
// yes, loop the JsonNode and display one by one
for (JsonNode node : arrayNode) {
ObjectNode obNode = objectMapper.createObjectNode();
System.out.println("Name: " + node.get("name").asText());
System.out.println("Passcode: " + node.get("passcode").asInt());
obNode.put("name", node.get("name").asText());
obNode.put("passcode", node.get("passcode").asInt());
arNode.add(obNode);
}
}
// Get user info
ObjectNode obNode = objectMapper.createObjectNode();
Scanner scan = new Scanner(System.in);
System.out.println("What is the account holder's name?");
obNode.put("name",scan.nextLine());
System.out.println("Please enter a 7-digit passcode");
obNode.put("passcode",scan.nextInt());
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
arNode.add(obNode);
objectMapper.writeValue(accounts,arNode);
}
catch (IOException ex)
{
System.out.println(ex.toString());
}
}
}
Выход
[
{
"name" : "Sam",
"passcode" : 1234567
},
{
"name" : "Max",
"passcode" : 7654321
},
{
"name" : "john",
"passcode" : 1234567
}
]
Большое спасибо! Это было чрезвычайно полезно. И последний вопрос: какие методы, которые я использовал, устарели?
На самом деле, методы, которые вы использовали, хороши. Моя IDE отображается как устаревшая. Вы не использовали его.
Вы проверили, правильно ли вы прочитали файл, прежде чем пытаться добавить новую информацию?