如何 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 中你有

  1. getter 和 setter
  2. 如果您添加自己的具有参数的构造函数,则为空构造函数。但是如果你不添加任何构造函数,那么就不需要添加这个默认的空构造函数,因为 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 字符串转换,我假设您已经知道或可以找到方法。