当前位置: 首页 > 知识库问答 >
问题:

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

归德厚
2023-03-14

使用Spring 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());
        }
    }
}

我可能做错了什么?

共有3个答案

强烨
2023-03-14

您可以使用jakson数据绑定

JacksonObjectMapper类(com.fasterxml.Jackson.databind.ObjectMapper)是解析JSON的最简单方法之一。Jackson ObjectMapper可以从字符串、流或文件解析JSON,并创建表示解析JSON的Java对象或对象图<代码>将JSON解析为Java对象也被称为从JSON反序列化Java对象。

// 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文件中有jakson数据绑定

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.4</version>
</dependency>
万勇
2023-03-14

在Spring Boot项目中,您可以使用ResourceUtils

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

ClassPathResource

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

有时,如果您正在读取不同的扩展文件,如.graphql.mmdb.json,则需要使用springResourceLoader将其作为InputStream来读取,本文有明确的解释

@Autowire
private ResourceLoader resourceLoader;

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

并使用文件输入流复制到临时文件中。复制

Files.copy(inputStream, outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
奚瑾瑜
2023-03-14

虽然@Deadpool已经给出了答案,但我想补充一点,当创建spring boot工件时,不再有这样的src/main/文件夹(您可以打开spring boot工件并自己确认)。

因此,您不能像这样加载资源:

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

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

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

请注意前缀类路径这意味着资源将从类路径解析(读取所有正确打包到工件中的内容)。

有一个相当好的教程,可以方便

 类似资料:
  • 问题内容: 我想像这样从我的jar中读取资源: //Read the file 并且在Eclipse中运行它时效果很好,但是如果我将其导出到jar中运行,则会出现: 我真的不知道为什么,但是经过一些测试,我发现我是否改变了 至 然后它的作用相反(它在jar中起作用,但在Eclipse中不起作用)。 我正在使用Eclipse,并且包含我的文件的文件夹位于类文件夹中。 问题答案: 而不是尝试将资源作为

  • 问题内容: 我有一个XML文件,需要在Android SDK中进行解析。 如何从资源中读取XML文件路径? XML包含: 问题答案: 将其放在文件夹下。然后,您可以使用以下命令打开它: 这里有一个有关如何使用的示例: http://android-er.blogspot.com/2010/04/read-xml-resources-in-android- using.html

  • 我想从我的jar中读取一个资源,如下所示: 在Eclipse中运行它时工作良好,但如果我将它导出到一个jar中,然后运行它,就会出现一个IllegalArgumentException: 我真的不知道为什么,但通过一些测试我发现如果我改变 至 然后它的工作方式相反(它在jar中工作,但不能在eclipse中工作)。 我使用的是Eclipse,我的文件所在的文件夹位于类文件夹中。

  • 问题内容: 我在abc.jar的类路径中有一个文件X.json。abc.jar中有一个readFile方法,该文件读取为 如果我从jar的上下文中运行它,即在abc.jar内的某个文件中的main方法中运行它,它将很好地读取 但是,当从abc.jar外部从其他代码中调用readFile时,它将失败 如何通过从jar的上下文外部调用readFile方法获取File对象? 问题答案: 到部署时,这些资

  • 以下是我得到的错误: 提前感谢!

  • 我有一个文本文件(.txt),我想成为以后可以扫描的资源。 在pubspec.yaml,我已经确保: 存在。该文件位于我创建的文件夹中,与和处于同一级别 我试图从自定义类读取文件,而不是小部件。 根据文档,我将使用此导入: 然后开始这样读: 要获得实际数据,请执行以下操作: 但是,当我使用