Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Java 尝试返回实现同一接口的不同类的筛选Json对象数组时出现异常_Java_Json_Playframework_Playframework 2.0_Ebean - Fatal编程技术网

Java 尝试返回实现同一接口的不同类的筛选Json对象数组时出现异常

Java 尝试返回实现同一接口的不同类的筛选Json对象数组时出现异常,java,json,playframework,playframework-2.0,ebean,Java,Json,Playframework,Playframework 2.0,Ebean,这是一个Play Framework 2.0.4,Java控制器操作,旨在返回一个Json数组,其中包含实现同一接口的类外的各种实例。我想将Json字段限制为4个siren、nic、ncc、nccenr,我的对象是法国机构。 我实例化了一个机构的ArrayList,其中填充了通过EBean查询过滤的不同机构的实例 public static Result getCollectivitesList() { List<Institution> collectivites = n

这是一个Play Framework 2.0.4,Java控制器操作,旨在返回一个Json数组,其中包含实现同一接口的类外的各种实例。我想将Json字段限制为4个siren、nic、ncc、nccenr,我的对象是法国机构。 我实例化了一个机构的ArrayList,其中填充了通过EBean查询过滤的不同机构的实例

public static Result getCollectivitesList() {

    List<Institution> collectivites = new ArrayList<Institution>();

    collectivites.addAll(Commune.find.where().eq("departement", Departement.findByCode("44")).findList());
    collectivites.addAll(EtablissementPublic.find.all());
    collectivites.addAll(Departement.find.where().eq("code", 44).findList());
    collectivites.addAll(Region.find.where().eq("code", 52).findList());


    JsonContext jsonContext = Ebean.createJsonContext();
    JsonWriteOptions options = new JsonWriteOptions();
    options.setRootPathProperties("siren, nic, ncc, nccenr");
    String jsonString = jsonContext.toJsonString(collectivites, true, options);
    return ok(Json.parse(jsonString));

}
调用JsonContext.toJsonString时引发此异常。我不理解这个问题,多态性问题之间的关系,异常和启动它的方法。 你有更好的主意吗

编辑:

我尝试了另一种选择。我编写了一个嵌套类:

private static class SimplifiedInstitution {
    String siren;
    String nic;
    String ncc;
    String nccenr;

    public SimplifiedInstitution(String siren, String nic, String ncc, String nccenr) {
        this.siren = siren;
        this.nic = nic;
        this.ncc = ncc;
        this.nccenr = nccenr;
    }
}
我在foreach循环中填充SimplifiedInstitution的ArrayList,而不是jsonContext:

for (Institution institution : collectivites) {
        simplified.add(new SimplifiedInstitution(institution.siren(), institution.nic(), institution.ncc(), institution.nccenr()));
    }
然后像这样返回Json:

return ok(Json.toJson(simplified));

最后一行抛出完全相同的异常…

我用DIY技巧解决了这个问题:使用上面的替代方法,覆盖SimplifiedInstitution的toString方法:

然后重写控制器操作的返回语句,如下所示:

return ok(simplified.toString()).as("application/json");
这不是很令人满意,也不能解释问题的原因,但它是有效的

PS:对不起,我的英语

public String toString() {
        return "{\"siren\":\"" + siren + "\",\"nic\":\"" + nic + "\",\"ncc\":\"" + ncc + "\",\"nccenr\":\"" + nccenr + "\"}";
    }
return ok(simplified.toString()).as("application/json");