#java #json
#ява #json #java
Вопрос:
Мне было трудно прочитать мой файл json в каталоге: E:1PROGRAMMINGPadlocksrcpadlockregisterinfo.json
{
"users": [
{
"Email": "3",
"Second Name": "2",
"Age": "123",
"Name": "1",
"Password": "4"
}
]
}
Проблема в том, что каждый раз, когда я пытаюсь прочитать свой файл содержимого как объект json, я получаю ошибку, похожую на заголовок сообщения.
Основная идея состоит в том, чтобы прочитать этот файл json, чтобы добавить нового пользователя в массив «users» внутри моего объекта json и создать базовую базу данных локальных пользователей.
private static void SignUp() throws IOException, JSONException, ParseException {
//System.out.println("SignUp");
String path = "E:\1PROGRAMMING\Padlock\src\padlock\register\info.json";
String[] labels = {"Age","Name","Second Name","Email","Password"};
ArrayList<String> dataUser = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
//check if value Integer
System.out.println(labels[0]);
int age = Integer.parseInt(scanner.nextLine());
if( age >= 18) {
dataUser.add(Integer.toString(age)); //adding age data to arraylist as first data
for (int element =1;element< labels.length;element ){ //adding rest of data
System.out.println(labels[element]);
String data = scanner.nextLine();
dataUser.add(data);
}
/////////////////////////////////////////////////
//Spring data request to Python serverless
/////////////////////////////////////////////////
System.out.println(dataUser);
//Add to JSON file
File exists = new File(path);
if (exists.exists()) {//check if json exists
System.out.println("File found.");
//addToJson()
addToJson(path, dataUser); //HERE IS THE PROBLEM
}else{
System.out.println("File not found... Creating File with the new user");
//createJson()
createJson(path, dataUser, labels);
//createJson(path, name, secondName,age,email,password);
}
}else {
System.out.println("You must be more than 18 years old.");
System.exit(0);
}
}
И функция addToJson, в которой я хочу прочитать и отредактировать свой файл
private static void addToJson(String path, ArrayList<String> dataUser) throws IOException, ParseException, JSONException {
//create jsonobject to add in our path file
//read path file content
JSONObject ar = new JSONObject(path);
for (int i = 0; i < ar.length(); i ) {
System.out.println( "Name: " ar.getString("Password") );
}
//Add jsonobject created into our path file
}
И он выводит это сообщение об ошибке:
** Исключение в потоке «main» org.json.JSONException: текст JSONObject должен начинаться с ‘{‘ символа 1 в E:1PROGRAMMINGPadlocksrcpadlockregisterinfo.json **
Комментарии:
1. опубликовали ответ, дайте мне знать, сработал ли он для вас.
Ответ №1:
Я думаю, что это может быть из-за того, что он считывает мой файл josn как строку и находит «[» в неправильном индексе, но мне нужно найти способ, которым я могу прочитать его как элемент Json или получить прямой доступ к «users» JSONArray внутри него
Ответ №2:
Ваш JSON
правильный, вы можете проверить наhttps://jsonformatter.curiousconcept.com /#
Проблема в строке
JSONObject ar = new JSONObject(path);
поскольку ваша переменная path
имеет тип String
, JSONObject не знает, является ли это путем к .json
файлу, следовательно, он пытается разобрать <file Location>
в JSON, и вы получаете JSONParseException
отсюда ошибка, попробуйте это
String text = new String(Files.readAllBytes(Paths.get(fileName)),StandardCharsets.UTF_8);
JSONObject obj = new JSONObject(text);
Ответ №3:
public class Foo {
public static void main(String[] args) throws IOException {
Path path = Paths.get("e:/info.json");
Map<Long, User> users = loadUsers(path);
signUp(users);
saveUsers(path, users);
}
public static Map<Long, User> loadUsers(Path path) throws IOException {
JSONObject root = readRootObject(path);
Map<Long, User> users = new HashMap<>();
if (root != null) {
for (Object obj : root.getJSONArray("users")) {
JSONObject json = (JSONObject)obj;
User user = new User();
user.setId(json.getLong("id"));
user.setEmail(json.getString("email"));
user.setName(json.getString("name"));
user.setSecondName(json.getString("secondName"));
user.setId(json.getInt("age"));
user.setPassword(json.getString("password"));
users.put(user.getId(), user);
}
}
return users;
}
public static void saveUsers(Path path, Map<Long, User> users) throws IOException {
JSONObject root = Optional.ofNullable(readRootObject(path)).orElseGet(JSONObject::new);
root.put("users", users.values());
try (Writer writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write(root.toString(2));
}
}
private static JSONObject readRootObject(Path path) throws IOException {
if (!Files.isReadable(path))
return null;
try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
return new JSONObject(new JSONTokener(reader));
}
}
public static void signUp(Map<Long, User> users) {
try (Scanner scan = new Scanner(System.in)) {
User user = new User();
System.out.print("Enter age: ");
user.setAge(scan.nextInt());
if (user.getAge() < 18)
throw new RuntimeException("You must be more than 18 years old.");
System.out.print("Enter email: ");
user.setEmail(scan.next());
System.out.print("Enter name: ");
user.setName(scan.next());
System.out.print("Enter second name: ");
user.setSecondName(scan.next());
System.out.print("Enter password: ");
user.setPassword(scan.next());
user.setId(System.nanoTime());
users.put(user.getId(), user);
}
}
}