Чтение JSON-файлов из относительных путей
Теперь, когда у нас есть действительный JSON-файл, давайте узнаем, как прочитать его из относительного пути в нашем Java-приложении. Использование относительных путей — хорошая практика, потому что она делает ваш код более переносимым между различными средами.
Понимание относительных путей в Java
Относительный путь указывается относительно текущего рабочего каталога. В Java-приложениях текущим рабочим каталогом обычно является корневой каталог вашего проекта (в нашем случае, ~/project
).
Например, если наш рабочий каталог — ~/project
, то относительный путь к нашему JSON-файлу будет src/main/resources/data.json
.
Создание класса чтения JSON
Давайте создадим Java-класс, который читает наш JSON-файл из относительного пути:
- В WebIDE перейдите в
~/project/src/main/java
.
- Щелкните правой кнопкой мыши по папке
java
и выберите "New File" (Новый файл).
- Назовите файл
JsonReader.java
.
- Добавьте следующий код в файл:
import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class JsonReader {
public static void main(String[] args) {
try {
// Specify the relative path to the JSON file
String filePath = "src/main/resources/data.json";
// Print the current working directory for reference
System.out.println("Current working directory: " + System.getProperty("user.dir"));
System.out.println("Trying to read JSON from: " + filePath);
// Read the contents of the JSON file
String jsonData = new String(Files.readAllBytes(Paths.get(filePath)));
// Print the raw JSON data
System.out.println("\nRaw JSON data:");
System.out.println(jsonData);
// Parse the JSON data into a JSONObject
JSONObject jsonObject = new JSONObject(jsonData);
// Access basic JSON data
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String email = jsonObject.getString("email");
boolean isEmployed = jsonObject.getBoolean("isEmployed");
// Print the extracted data
System.out.println("\nExtracted data:");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Email: " + email);
System.out.println("Employed: " + isEmployed);
System.out.println("\nJSON file has been successfully read and parsed.");
} catch (IOException e) {
System.out.println("Error reading JSON file: " + e.getMessage());
e.printStackTrace();
} catch (Exception e) {
System.out.println("Error parsing JSON: " + e.getMessage());
e.printStackTrace();
}
}
}
Этот класс:
- Определяет относительный путь к нашему JSON-файлу
- Выводит текущий рабочий каталог для справки
- Читает содержимое файла с помощью
Files.readAllBytes
- Парсит данные JSON в
JSONObject
- Извлекает и выводит некоторые данные из JSON-объекта
Платформонезависимая обработка путей
Приведенный выше код использует прямые слеши (/
) для пути к файлу, что работает как в системах на основе Unix (Linux, macOS), так и в Windows. Однако для более платформонезависимого подхода можно использовать константу File.separator
:
String filePath = "src" + File.separator + "main" + File.separator + "resources" + File.separator + "data.json";
Это гарантирует использование правильного разделителя пути независимо от операционной системы.
Запуск JSON Reader
Давайте запустим нашу программу JSON Reader:
cd ~/project
mvn compile
java -cp target/classes:$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout) JsonReader
Вы должны увидеть вывод, похожий на этот:
Current working directory: /home/labex/project
Trying to read JSON from: src/main/resources/data.json
Raw JSON data:
{
"name": "John Doe",
"age": 28,
"email": "[email protected]",
"isEmployed": true,
"address": {
"street": "123 Main St",
"city": "Anytown",
"zipCode": "12345"
},
"skills": ["Java", "SQL", "JavaScript", "HTML"]
}
Extracted data:
Name: John Doe
Age: 28
Email: [email protected]
Employed: true
JSON file has been successfully read and parsed.
Это подтверждает, что мы успешно прочитали наш JSON-файл из относительного пути и извлекли некоторые данные.
Использование ресурсов класса для независимости от пути
Другой распространенный подход к чтению файлов в Java-приложениях — использование загрузчика классов для доступа к ресурсам в classpath. Этот подход особенно полезен для JAR-файлов и развернутых приложений.
Давайте создадим еще один класс, который демонстрирует этот подход:
- В WebIDE перейдите в
~/project/src/main/java
.
- Щелкните правой кнопкой мыши по папке
java
и выберите "New File" (Новый файл).
- Назовите файл
ClasspathJsonReader.java
.
- Добавьте следующий код в файл:
import org.json.JSONObject;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class ClasspathJsonReader {
public static void main(String[] args) {
try {
// Get the resource as an input stream
InputStream inputStream = ClasspathJsonReader.class.getClassLoader().getResourceAsStream("data.json");
if (inputStream == null) {
System.out.println("Could not find data.json on the classpath");
return;
}
// Read the input stream into a string
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder jsonData = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonData.append(line).append("\n");
}
// Parse the JSON data
JSONObject jsonObject = new JSONObject(jsonData.toString());
// Print some data
System.out.println("Name: " + jsonObject.getString("name"));
System.out.println("Age: " + jsonObject.getInt("age"));
System.out.println("JSON file successfully read from classpath.");
} catch (IOException e) {
System.out.println("Error reading JSON file: " + e.getMessage());
e.printStackTrace();
} catch (Exception e) {
System.out.println("Error parsing JSON: " + e.getMessage());
e.printStackTrace();
}
}
}
Этот метод будет работать независимо от рабочего каталога, если файл находится в classpath. Однако нам нужно сначала скомпилировать, чтобы сделать ресурсы доступными в classpath:
cd ~/project
mvn compile
java -cp target/classes:$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout) ClasspathJsonReader
Вы можете не увидеть ожидаемый вывод, потому что ресурсы не копируются должным образом в classpath во время простой компиляции. Для производственного приложения вы будете использовать mvn package
для создания JAR-файла со всеми включенными ресурсами.