java 如何在Sping Boot 中从资源中读取JSON文件

dldeef67  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(163)

使用Sping Boot 2.1.5发行版,创建了以下Spring Boot微服务示例:
Maven项目结构:

MicroService
    │
    pom.xml
    src
    │
    └───main
        │ 
        ├───java
        │   │ 
        │   └───com
        │       └───microservice
        │           │
        │           └───MicroServiceApplication.java  
        │  
        └───resources
            │
            └───data.json
                │                    
                application.properties

具有以下JSON文件(位于src/main/resources/data.json内):

{"firstName": "John", "lastName": "Doe"}

微服务应用程序:

@SpringBootApplication
public class MicroServiceApplication {

    @Bean
    CommandLineRunner runner() {
        return args -> {
            String data = FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);
            System.out.println(data);
        };
    }

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceApplication.class, args);
    }
}

引发以下异常:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
  ...
  Caused by: java.io.IOException: Stream is null

FilePathUtils.java:

import io.micrometer.core.instrument.util.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

public class FilePathUtils {
    public static String readFileToString(String path, Class aClazz) throws IOException {

        try (InputStream stream = aClazz.getClassLoader().getResourceAsStream(path)) {
            if (stream == null) {
                throw new IOException("Stream is null");
            }
            return IOUtils.toString(stream, Charset.defaultCharset());
        }
    }
}

我到底做错了什么?

lvmkulzt

lvmkulzt1#

虽然@Deadpool已经提供了答案,但我想补充的是,当创建spring Boot 的工件时,不再存在这样的src/main/文件夹(您可以打开spring boot工件并自行确定)。
因此,您不能像这样加载资源:

FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);

Spring确实有一个名为Resource的抽象,它可以在应用程序中使用,甚至可以注入到类/配置中:

@Value("classpath:data/data.json")
Resource resourceFile;

注意前缀“classpath”,它意味着资源将从类路径解析(读取正确打包到工件中的所有内容)。
有一个相当不错的Tutorial可以方便使用

ryevplcw

ryevplcw2#

在spring Boot 项目中,可以使用ResourceUtils

Path file = ResourceUtils.getFile("data/data.json").toPath();

ClassPathResource

String clsPath =  new ClassPathResource("data/data.json").getPath();

有时如果你正在阅读不同的扩展名文件,如.graphql.mmdb.json,你需要使用spring ResourceLoader将其读取为InputStream,此article有明确的解释

@Autowire
private ResourceLoader resourceLoader;

   Resource resource =resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
   InputStream dbAsStream = resource.getInputStream();

然后使用Files.copyInputStream复制到临时文件

Files.copy(inputStream, outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
lyr7nygr

lyr7nygr3#

您可以使用jackson-databind库。
JacksonObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是解析JSON最简单的方法之一。Jackson ObjectMapper将can parse JSON从字符串、流或文件以及create a Java object or object graph表示的JSON解析为Java对象。Parsing JSON也称为deserialize Java objects from JSON。

// create Object Mapper
ObjectMapper mapper = new ObjectMapper();

// read JSON file and map/convert to java POJO
try {
    SomeClass someClassObject = mapper.readValue(new File("../src/main/resources/data.json"), SomeClass.class);
    System.out.println(someClassObject);
} catch (IOException e) {
    e.printStackTrace();
}

并且您的.pom文件中应该包含jackson-databind

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.4</version>
</dependency>

相关问题