如何 return java 中多个 JSON 项的列表
How to return a list of multiple JSON items in java
我正在尝试弄清楚如何 return 多个 JSON 项目。现在我可以 return 一个 JSON 像这样:
{
"result": {
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
},
"error": null
}
但我想 return 多个 JSON 项目,像这样:
{
"result": {{
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
}
{
"userId": "fghi456",
"telephoneNumber": "1-333-3333333"
}
},
"error": null
}
我可以将多个 JSON 项目视为字符串,如下所示,但我想 return 它作为多个 JSON 项目,但我不知道如何:
[LDAPModel(userId=abcde123, telephoneNumber=1-555-5555555), LDAPModel(userId=fghi456, telephoneNumber=1-333-3333333]
我完全是 Java 的初学者,我不太了解 Java 的语法。但是我从 SpringBoot 获得了这些代码(包括下面的代码);我真的不明白它在做什么,所以我不知道如何创建列表的输出。
目前,这是我得到的:
public Optional<LDAPModel> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
// for (int ii = 0; ii < ldapModelList.size(); ii++) {
// Optional.of(ldapModelList.get(ii));
// ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList.get(ii));
// }
return ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList.get(0));
}
我试着把它放在一个循环中(就像上面注释掉的代码一样),但我不知道如何创建一个列表。我尝试删除 get(0),但出现语法错误...我尝试了很多方法,但都无济于事。
有人可以帮忙吗?
Update/Edit:谢谢大家的回答。我发布了一个后续问题 。如果你有机会,请帮助我。谢谢。
我觉得这个结构很奇怪。您所拥有的看起来像您希望结果是一个对象数组:
{
"result": [
{ "userId": "abcde123",
"telephoneNumber": "1-555-5555555" }
{ "userId": "fghi456",
"telephoneNumber": "1-333-3333333" }
],
"error": null
}
给定一个合理的JSON库,那么JSON对象的“result”成员的值是一个JSON数组,然后你可以从中挑选出每个元素依次通过索引,每个元素都是一个 JSON 对象,有 2 个成员。
首先我想指出您的 JSON 格式不正确。当你想在 JSON 中表示多个对象时,你应该使用方括号并用逗号分隔每个对象:
{
"result": [
{
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
},
{
"userId": "fghi456",
"telephoneNumber": "1-333-3333333"
}
],
"error": null
}
当您尝试删除 get(0) 时,您的 Java 代码不起作用的原因是方法 public Optional<LDAPModel> getDirectReports(String cdsID)
return 是 Optional<LDAPModel>
类型,并且通过删除 get(0) 你实际上是在尝试 return 一个 Optional<List<LDAPModel>>
。如果您希望该方法 return 一个列表而不是单个对象,您可以将 return 类型更改为 Optional<List<LDAPModel>>
然后安全地删除 get(0).
public Optional<List<LDAPModel>> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
return ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList);
}
我假设您已经设法获得 LDAPModel 的所有 list/array,即 List ldapModelList
如果是这样,您只需要 return 在您的 getDirectReports 方法中使用此 ldapModelList。
public List<LDAPModel> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
return ldapModelList;
}
然后只需使用您的库即可 return json 数组。我想你使用杰克逊。
只要确保在 LDAPModel 中你有
- getter 和 setter
- 如果您添加自己的具有参数的构造函数,则为空构造函数。但是如果你不添加任何构造函数,那么就不需要添加这个默认的空构造函数,因为 java 会自动为你创建它。
LDAP模型class如下:
public class LDAPModel {
String userId;
String telephoneNumber;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getTelephoneNumber() {
return telephoneNumber;
}
public void setTelephoneNumber(String telephoneNumber) {
this.telephoneNumber = telephoneNumber;
}
}
对于使用 Jackson 将对象 JSON 字符串转换,我假设您已经知道或可以找到方法。
我正在尝试弄清楚如何 return 多个 JSON 项目。现在我可以 return 一个 JSON 像这样:
{
"result": {
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
},
"error": null
}
但我想 return 多个 JSON 项目,像这样:
{
"result": {{
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
}
{
"userId": "fghi456",
"telephoneNumber": "1-333-3333333"
}
},
"error": null
}
我可以将多个 JSON 项目视为字符串,如下所示,但我想 return 它作为多个 JSON 项目,但我不知道如何:
[LDAPModel(userId=abcde123, telephoneNumber=1-555-5555555), LDAPModel(userId=fghi456, telephoneNumber=1-333-3333333]
我完全是 Java 的初学者,我不太了解 Java 的语法。但是我从 SpringBoot 获得了这些代码(包括下面的代码);我真的不明白它在做什么,所以我不知道如何创建列表的输出。
目前,这是我得到的:
public Optional<LDAPModel> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
// for (int ii = 0; ii < ldapModelList.size(); ii++) {
// Optional.of(ldapModelList.get(ii));
// ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList.get(ii));
// }
return ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList.get(0));
}
我试着把它放在一个循环中(就像上面注释掉的代码一样),但我不知道如何创建一个列表。我尝试删除 get(0),但出现语法错误...我尝试了很多方法,但都无济于事。
有人可以帮忙吗?
Update/Edit:谢谢大家的回答。我发布了一个后续问题
我觉得这个结构很奇怪。您所拥有的看起来像您希望结果是一个对象数组:
{
"result": [
{ "userId": "abcde123",
"telephoneNumber": "1-555-5555555" }
{ "userId": "fghi456",
"telephoneNumber": "1-333-3333333" }
],
"error": null
}
给定一个合理的JSON库,那么JSON对象的“result”成员的值是一个JSON数组,然后你可以从中挑选出每个元素依次通过索引,每个元素都是一个 JSON 对象,有 2 个成员。
首先我想指出您的 JSON 格式不正确。当你想在 JSON 中表示多个对象时,你应该使用方括号并用逗号分隔每个对象:
{
"result": [
{
"userId": "abcde123",
"telephoneNumber": "1-555-5555555"
},
{
"userId": "fghi456",
"telephoneNumber": "1-333-3333333"
}
],
"error": null
}
当您尝试删除 get(0) 时,您的 Java 代码不起作用的原因是方法 public Optional<LDAPModel> getDirectReports(String cdsID)
return 是 Optional<LDAPModel>
类型,并且通过删除 get(0) 你实际上是在尝试 return 一个 Optional<List<LDAPModel>>
。如果您希望该方法 return 一个列表而不是单个对象,您可以将 return 类型更改为 Optional<List<LDAPModel>>
然后安全地删除 get(0).
public Optional<List<LDAPModel>> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
return ldapModelList.isEmpty() ? Optional.empty() : Optional.of(ldapModelList);
}
我假设您已经设法获得 LDAPModel 的所有 list/array,即 List ldapModelList
如果是这样,您只需要 return 在您的 getDirectReports 方法中使用此 ldapModelList。
public List<LDAPModel> getDirectReports(String cdsID) {
LdapQuery ldapQuery = LdapQueryBuilder.query()
.searchScope(SearchScope.SUBTREE)
.where("objectclass").is("person")
.and("managerID").like(cdsID);
List<LDAPModel> ldapModelList = ldapTemplate.search(ldapQuery, (Attributes attrs) ->
LDAPModel.builder()
.userId(getValue(attrs, "userid"))
.telephoneNumber(getValue(attrs, "phoneNumber"))
.build());
return ldapModelList;
}
然后只需使用您的库即可 return json 数组。我想你使用杰克逊。 只要确保在 LDAPModel 中你有
- getter 和 setter
- 如果您添加自己的具有参数的构造函数,则为空构造函数。但是如果你不添加任何构造函数,那么就不需要添加这个默认的空构造函数,因为 java 会自动为你创建它。
LDAP模型class如下:
public class LDAPModel {
String userId;
String telephoneNumber;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getTelephoneNumber() {
return telephoneNumber;
}
public void setTelephoneNumber(String telephoneNumber) {
this.telephoneNumber = telephoneNumber;
}
}
对于使用 Jackson 将对象 JSON 字符串转换,我假设您已经知道或可以找到方法。