SpringBootRESTAPI将对象列表返回为json
我使用的是spring boot版本2.3.3,下面是我的pom.xmlSpringBootRESTAPI将对象列表返回为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
<?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"
}