如何将正确的JSON从服务器端java返回到数据表?

如何将正确的JSON从服务器端java返回到数据表?,java,json,datatables,gson,Java,Json,Datatables,Gson,如何连接两个数组,然后将结果作为JSON返回给DataTables 我正在转换一个工作的DataTables以包含服务器端处理,并且一直在从java服务器端返回正确的数组。当前返回的数组为: List<YthMmbrSectDtls> ymList; 对于DataTables服务器端,我需要在返回的JSON的开头包含额外的信息,例如: {"draw":9, "recordsTotal:57", "recordsFiltered:57

如何连接两个数组,然后将结果作为JSON返回给DataTables

我正在转换一个工作的DataTables以包含服务器端处理,并且一直在从java服务器端返回正确的数组。当前返回的数组为:

List<YthMmbrSectDtls> ymList;
对于DataTables服务器端,我需要在返回的JSON的开头包含额外的信息,例如:

{"draw":9, "recordsTotal:57", "recordsFiltered:57"[...]}
因此,我返回:

{"draw":9, "recordsTotal:57", "recordsFiltered:57","data":[{"youthMemberID":"MTQ5","surname":"Tendon","firstName":"Achilles"}]}
至少从阅读手册和观看视频中我了解到了这一点

我目前的代码是:

List<YthMmbrSectDtls> ymList;
String[] dtInfo = {"draw", "recordsTotal", "recordsFiltered"};

ymList = MySQLConnection.getYouthMmbrAllDtls(archived);
        
//Test to be replaced by database call, as per above
dtInfo[0] = "9";
dtInfo[1] = "57";
dtInfo[2] = "57";

if (ymList == null || ymList.isEmpty()) {
    response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No members.");
} else {
    System.out.println("ymList: " + ymList);
    String json = new Gson().toJson(ymList);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}
List-ymList;
字符串[]dtInfo={“draw”、“recordsTotal”、“recordsFiltered”};
ymList=MySQLConnection.getYouthMembrallDTLS(已存档);
//测试将替换为数据库调用,如上所述
dtInfo[0]=“9”;
dtInfo[1]=“57”;
dtInfo[2]=“57”;
if(ymList==null | | ymList.isEmpty()){
sendError(HttpServletResponse.SC_BAD_请求,“无成员”);
}否则{
System.out.println(“ymList:+ymList”);
字符串json=new Gson().toJson(ymList);
setContentType(“应用程序/json”);
响应。setCharacterEncoding(“UTF-8”);
response.getWriter().write(json);
}

有多种不同的解决方法:

修改JsonElement树 您可以首先使用将
ymList
转换为内存中的
JsonArray
,然后将其包装在
JsonObject
中,您可以将
dtInfo
属性添加到该对象中:

JsonObject dtInfoJsonObj=newjsonobject();
dtInfoJsonObj.addProperty​(“draw”,dtInfo[0]);
dtInfoJsonObj.addProperty​(“recordsTotal”,dtInfo[1]);
dtInfoJsonObj.addProperty​(“记录过滤”,dtInfo[2]);
Gson Gson=新的Gson();
JsonArray ymJsonArray=gson.toJsonTree(ymList.getAsJsonArray();
添加(“数据”,ymJsonArray);
字符串json=gson.toJson(dtInfoJsonObj);
将数据包装在单独的类中 或者,您可以创建一个单独的类,例如
DtInfo
,该类包含属性和数据,然后让Gson对其进行序列化。由于不存在创建JsonElement树的中间步骤,因此这种方法可能更有效

class-DtInfo{
//Gson将在序列化期间使用字段名;您还可以自定义它们
//使用`@SerializedName`
//此外,如果需要,可以将字段设置为私有
公开最终抽签;
公共最终记录总记录;
已过滤的公共最终int记录;
公开最终名单数据;
公共DtInfo(整数绘制、整数记录总计、整数记录过滤、列表数据){
this.draw=draw;
this.recordsTotal=recordsTotal;
this.recordsFiltered=已过滤的记录;
这个数据=数据;
}
}
然后像这样创建JSON:

DtInfo dtInfoObj=新的DtInfo(DtInfo[0],DtInfo[1],DtInfo[2],ymList);
字符串json=new Gson().toJson(dtInfoObj);

还请注意,您可能可以通过将
Gson
实例存储在
静态final
字段中来提高性能。Gson是线程安全的(请参阅),通过这种方式,它将缓存内部用于将对象转换为JSON的类型适配器


此外,Gson还提供了
toJson
重载,它接受一个
可追加的
。因此,您可以将
response.getWriter()
传递给这些Gson方法,从而避免创建JSON的中间
String
表示形式。

不确定,但您可以使用POJO来实现这一点。一个普通的类,包含您的列表和dt的特定数据。或是否可以通过另一个(json)库更改Gson?如果是谷歌Json简单,可能会更简单,但这只是我的观点。谢谢你,马可诺,我也会尝试你的其他评论。你好,格林
List<YthMmbrSectDtls> ymList;
String[] dtInfo = {"draw", "recordsTotal", "recordsFiltered"};

ymList = MySQLConnection.getYouthMmbrAllDtls(archived);
        
//Test to be replaced by database call, as per above
dtInfo[0] = "9";
dtInfo[1] = "57";
dtInfo[2] = "57";

if (ymList == null || ymList.isEmpty()) {
    response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No members.");
} else {
    System.out.println("ymList: " + ymList);
    String json = new Gson().toJson(ymList);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}