Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringBootRESTAPI将对象列表返回为json_Json_Spring Boot_Rest - Fatal编程技术网

SpringBootRESTAPI将对象列表返回为json

SpringBootRESTAPI将对象列表返回为json,json,spring-boot,rest,Json,Spring Boot,Rest,我使用的是spring boot版本2.3.3,下面是我的pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati

我使用的是spring boot版本2.3.3,下面是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.group</groupId>
    <artifactId>artifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>project</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
Its存储库(接口和实现)

i、 例如,“date”、“attr2”等是我总结的属性(已经用getter/setter定义)

这里少了什么

--------更新---------

根据下面的回答,我有一个SummaryResponse类

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

public class SummaryResponse {

    @JsonProperty(value = "summary", required = true)
    List<Summary> summaryList;

    public SummaryResponse() {
    }

    public List<Summary> getSummaryList() {
        return summaryList;
    }

    public void setSummaryList(List<Summary> summaryList) {
        this.summaryList = summaryList;
    }
}
到底是什么问题

我的样子如下:

[
    { "date": "2020-07-31", "attr2": "attr2_value", "attr3": "attr3_value", "attr4", null, "attr5": "attr5_value" },
    { "date": "2020-07-31", "attr2": "attr2_value", "attr3": "attr3_value", "attr4", "attr4_value", "attr5": "attr5_value" }
]
------------------更新2发现问题。----------------

谢谢你的提示,我明白了

在我的存储库中,我使用本机查询,其中类不是实体

List<Summary> summaryList = query.getResultList();
return summaryList;
List summaryList=query.getResultList();
返回汇总表;
虽然我在summaryList中获取结果,但它实际上是一个对象[],而不是List。(不知道这一点,spring boot和JPA的新手)

因此,尽管我的控制器正在将这个(summaryList)传递给响应,但它实际上是一个对象[]

我的摘要类不是实体(不来自表或具有标识),因此更改了我的存储库方法:

List<Object> result = (List<Object>) query.getResultList();
    Iterator it = result.iterator();
    List<Summary> summaryList = new ArrayList<>();

    while (it.hasNext()) {
        Object[] row = (Object[]) it.next();
        Summary summary = new Summary();
        summary.setDate( (Date) row[0]);
        summary.setName(String.valueOf(row[1]));
        summary.setAccount(String.valueOf(row[2]));
        ...
        ...
        // and so on
        summaryList.add(summary);
    }
List result=(List)query.getResultList();
迭代器it=result.Iterator();
List summaryList=新的ArrayList();
while(it.hasNext()){
Object[]行=(Object[])it.next();
摘要=新摘要();
summary.setDate((日期)行[0]);
summary.setName(String.valueOf(第[1]行));
汇总表.setAccount(字符串.valueOf(第[2]行));
...
...
//等等
summaryList.add(摘要);
}

最后,它终于如期工作了。

实现这一点有多种方法。您可以编写自己的响应类并添加Jackson注释。您需要对Summary类执行相同的操作

public class MyResponse {

    @JsonProperty(value = "summary", required = true)
    List<Summary> summaryList;

    public List<Summary> getSummaryList() {
        return summaryList;
    }
    public void setSummaryList(List<Summary> summaryList) {
        this.summaryList = summaryList;
    }
}
公共类MyResponse{
@JsonProperty(value=“summary”,required=true)
列表摘要列表;
公共列表getSummaryList(){
返回汇总表;
}
公共无效集合汇总列表(列表汇总列表){
this.summaryList=summaryList;
}
}
确保您具有Jackson依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>

com.fasterxml.jackson.core
杰克逊注释

检查你的课程摘要。
基于您共享的http响应,问题应该存在——或者至少您应该能够通过添加jackson注释来解决它

在Summary类中使用日期类型,这很奇怪。如果您使用常规日期(import java.util.Date;),您的响应JSON响应应该如下所示:

{
  "id": "1",
  "name": "Ball",
  "date": "2020-10-09T19:05:17.189+00:00"
}
但是JSON有一个短字符串表示日期:“date”:“2020-07-31”。
因此,可能在Summary类中导入了一个Date类,但Jackson不支持该类。
尝试删除date属性,然后再次检查JSON响应。
不返回列表,只返回列表中的一个元素。
这会帮助你发现你的问题

我写了这篇关于在SpringRestController中使用Jackson处理JSON的德国博文,因为这是SpringBoot中的默认设置:

到目前为止,代码对我来说还不错。能否显示
摘要
的属性?
spring boot starter web
带来了jackson依赖性。没有必要将其单独包含在存储库中。我可以添加这个类,但是在哪里使用它呢?在我的控制器中,我获取列表;我应该在那里做些改变吗?此外,我的API中将有许多这样的对象,因此我必须为每个对象编写响应类。在
getSummaryData()
中您究竟返回了什么?它是java.util.ArrayList吗?或者您在应用程序日志中看到了什么吗?您需要将返回值更改为ResponseEntity,然后在控制器中创建一个
新的MyResponse()
,并添加您的列表。很抱歉响应太晚。我根据建议更新了代码(请参阅更新),但仍然存在相同的问题。我缺少什么?Summary类是一个常规类,没有任何注释。公共类摘要{private Date Date;private String name;private String account;..//Constructor//getter和setter for all attributes.}是否所有属性或类都应该有响应对象的注释才能将其作为json响应发送?谢谢回答!作为下一次的提醒(我在这里为您添加了它),当链接到您自己的网站或内容(或您的附属内容)时,请您不要将其视为垃圾邮件。在堆栈交换策略下,用户名中包含与URL相同的文本或在配置文件中提及该文本不被视为充分的披露。
{"summary":[["2020-07-31","attr2_value","attr3_value", null, "attr5_value"] ,["2020-07-31","attr2_value","attr3_value","attr4_value","attr5_value"]]}
[
    { "date": "2020-07-31", "attr2": "attr2_value", "attr3": "attr3_value", "attr4", null, "attr5": "attr5_value" },
    { "date": "2020-07-31", "attr2": "attr2_value", "attr3": "attr3_value", "attr4", "attr4_value", "attr5": "attr5_value" }
]
List<Summary> summaryList = query.getResultList();
return summaryList;
List<Object> result = (List<Object>) query.getResultList();
    Iterator it = result.iterator();
    List<Summary> summaryList = new ArrayList<>();

    while (it.hasNext()) {
        Object[] row = (Object[]) it.next();
        Summary summary = new Summary();
        summary.setDate( (Date) row[0]);
        summary.setName(String.valueOf(row[1]));
        summary.setAccount(String.valueOf(row[2]));
        ...
        ...
        // and so on
        summaryList.add(summary);
    }
public class MyResponse {

    @JsonProperty(value = "summary", required = true)
    List<Summary> summaryList;

    public List<Summary> getSummaryList() {
        return summaryList;
    }
    public void setSummaryList(List<Summary> summaryList) {
        this.summaryList = summaryList;
    }
}
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>
{
  "id": "1",
  "name": "Ball",
  "date": "2020-10-09T19:05:17.189+00:00"
}