Play Framework Java - 为自动完成构建嵌套的 JSON 对象

Play Framework Java - Build nested JSON object for autocomplete

我是从 Python 过来的 Java 的新手,我想弄清楚如何遍历 ebean 查询结果集并将数据附加到 JSON 对象将被发送回前端的自动完成小部件。

我正在使用以下库:

目前搜索确实有效,但如果有多个结果我只得到一个,我怀疑这是因为我每次通过循环都覆盖了我的 JSON 对象。

JSON 对象上的 .putArray 方法是否每次都清除它,如果是,我应该如何将 JSON 对象附加到已经存在的 JSON 数组。

我的自动完成方法:

    @Security.Authenticated(Secured.class)
    public Result searchContacts(String term) {

    List<Contact> searchedContacts = Contact.find.where().eq("firm_id", session().get("firm")).or(com.avaje.ebean.Expr.like("first_name", "%"+ term + "%"),
            com.avaje.ebean.Expr.like("last_name",  "%" + term + "%")).findList();

    // build result set for autocomplete suggesstions
    ObjectNode suggestion = Json.newObject();

    for (Contact contact: searchedContacts) {
        ObjectNode result = Json.newObject();
        result.put("value", contact.firstName + ' ' + contact.lastName);
        result.put("data", contact.id);

        suggestion.putArray("suggestions").add(result);
    }

    return ok(suggestion);
}

JSON 结构必须是这样的:

            suggestions: [
            { "value": "United Arab Emirates", "data": "AE" },
            { "value": "United Kingdom",       "data": "UK" },
            { "value": "United States",        "data": "US" }
        ]

您需要将所有建议收集到某个集合中,即 com.fasterxml.jackson.databind.node.ArrayNode,然后用它创建一个 JSON 对象,此代码段可以满足您的需求(当然我假设您的数据库查询 returns有效数据集):

public Result searchContacts(String term) {

    List<Contact> searchedContacts = Contact.find.where()
                  .eq("firm_id", session().get("firm"))                                                               
                  .or(com.avaje.ebean.Expr.like("first_name", "%"+ term + "%"),
                  com.avaje.ebean.Expr.like("last_name",  "%" + term + "%"))
                  .findList();

    ArrayNode suggestions = Json.newArray();

    for (Contact contact : searchedContacts) {
        ObjectNode result = Json.newObject();
        result.put("value", contact.firstName + ' ' + contact.lastName);
        result.put("data", contact.id);
        suggestions.add(result);
    }

    ObjectNode output = Json.newObject();
    output.set("suggestions", suggestions);

    return ok(output);
}