使用了jfinal2.2 的renderjson方法为什么序列化list对象的时候没有属性

使用了最新的jfinal2.2,发现json输出有问题

代码如下:

blob.png

json输出结果是:

[["2016-10-28 01:02:28","",1,"7167","8333","2016-10-01 00:00:00","1","1.17",2,"足利ホールディングス","常陽銀行","東証1部","東証1部","2016/9/28 - 2016/9/30","アシカガホールディングス","ジョウヨウギンコウ","トウショウ","トウショウ"],["2016-10-28 01:02:28","",1,"3050","9855","2016-12-01 00:00:00","1","0.6",2,"DCMホールディングス","くろがねや","東証1部","東証2部","2016/11/28 - 2016/11/30","ディーシーエムホールディングス","クロガネヤ","トウショウ","トウショウ"]]

没有属性名,直接返回了数组格式。是怎么回事?

评论区

JFinal

2016-11-30 12:07

renderJson(list) 的参数是 List 类型,所以生成的json 是数组,这个是 json 数据格式规范,看这里的有关 json 数组规范就知道了: http://json.org/

截图中的 json 数据,最外层是数组,内层也是数组,如果希望生成的 json 有属性名,那么内部就不能是数组格式,而是 java bean 或者 map 都可以

raoda825

2016-11-30 12:42

但是我返回的那个对象是一个model类的对象。

raoda825

2016-11-30 12:47

public class Merger extends BaseMerger {

public static final Merger dao = new Merger();
public static final String tableName = TableMapping.me().getTable(Merger.class).getName();

@Override
protected Map getAttrs() {
// TODO Auto-generated method stub
return super.getAttrs();
}

public static List getAllMerger(Date date){
if(date == null){
return new ArrayList();
}
String sql = " select * from " + tableName + " where tm >= ? ";
return Db.query(sql,date);
}

}

model类代码。

JFinal

2016-11-30 13:04

@raoda825 这个就奇怪了,建议用一下 Json.getJson().toJson(list) 看一下结果是什么,另外再对单个对象进行一下 json 转换,看是什么结果,或许是你的项目在底层切换了 json 实现类,造成没有使用 jfinal 官方的 json 转换实现

raoda825

2016-11-30 13:18

打印这两段代码:

List list = Merger.getAllMerger(date);
System.out.println(Json.getJson().toJson(list.get(0)));
System.out.println(Json.getJson().toJson(list));
结果是:
["2016-10-28 01:02:28","",1,"7167","8333","2016-10-01","1","1.17",2,"足利ホールディングス","常陽銀行","東証1部","東証1部","2016/9/28 - 2016/9/30","アシカガホールディングス","ジョウヨウギンコウ","トウショウ","トウショウ"]

[["2016-10-28 01:02:28","",1,"7167","8333","2016-10-01","1","1.17",2,"足利ホールディングス","常陽銀行","東証1部","東証1部","2016/9/28 - 2016/9/30","アシカガホールディングス","ジョウヨウギンコウ","トウショウ","トウショウ"],["2016-10-28 01:02:28","",1,"3050","9855","2016-12-01","1","0.6",2,"DCMホールディングス","くろがねや","東証1部","東証2部","2016/11/28 - 2016/11/30","ディーシーエムホールディングス","クロガネヤ","トウショウ","トウショウ"]]

都是返回数组格式。
我的model类代码

public class Merger extends BaseMerger {

public static final Merger dao = new Merger();
public static final String tableName = TableMapping.me().getTable(Merger.class).getName();


public static List getAllMerger(Date date){
if(date == null){
return new ArrayList();
}
String sql = " select * from " + tableName + " where tm >= ? ";
return Db.query(sql,date);
}

}
父类BaseMerger代码:
public abstract class BaseMerger> extends Model implements IBean {

public void setTm(java.util.Date tm) {
set("tm", tm);
}

public java.util.Date getTm() {
return get("tm");
}

public void setMemo(java.lang.String Memo) {
set("Memo", Memo);
}

public java.lang.String getMemo() {
return get("Memo");
}

public void setMode(java.lang.Integer mode) {
set("mode", mode);
}

public java.lang.Integer getMode() {
return get("mode");
}

public void setDcode(java.lang.String dcode) {
set("dcode", dcode);
}

public java.lang.String getDcode() {
return get("dcode");
}

public void setScode(java.lang.String scode) {
set("scode", scode);
}

public java.lang.String getScode() {
return get("scode");
}

public void setDate(java.util.Date date) {
set("date", date);
}

public java.util.Date getDate() {
return get("date");
}

public void setDunit(java.lang.String dunit) {
set("dunit", dunit);
}

public java.lang.String getDunit() {
return get("dunit");
}

public void setSunit(java.lang.String sunit) {
set("sunit", sunit);
}

public java.lang.String getSunit() {
return get("sunit");
}

public void setType(java.lang.Integer type) {
set("type", type);
}

public java.lang.Integer getType() {
return get("type");
}

public void setDname(java.lang.String dname) {
set("dname", dname);
}

public java.lang.String getDname() {
return get("dname");
}

public void setSname(java.lang.String sname) {
set("sname", sname);
}

public java.lang.String getSname() {
return get("sname");
}

public void setDexchg(java.lang.String dexchg) {
set("dexchg", dexchg);
}

public java.lang.String getDexchg() {
return get("dexchg");
}

public void setSexchg(java.lang.String sexchg) {
set("sexchg", sexchg);
}

public java.lang.String getSexchg() {
return get("sexchg");
}

public void setComment(java.lang.String comment) {
set("comment", comment);
}

public java.lang.String getComment() {
return get("comment");
}

public void setDkname(java.lang.String dkname) {
set("dkname", dkname);
}

public java.lang.String getDkname() {
return get("dkname");
}

public void setSkname(java.lang.String skname) {
set("skname", skname);
}

public java.lang.String getSkname() {
return get("skname");
}

public void setDkexchg(java.lang.String dkexchg) {
set("dkexchg", dkexchg);
}

public java.lang.String getDkexchg() {
return get("dkexchg");
}

public void setSkexchg(java.lang.String skexchg) {
set("skexchg", skexchg);
}

public java.lang.String getSkexchg() {
return get("skexchg");
}

}

raoda825

2016-11-30 13:19

BaseMerger 是自带工具生成的。没有做任何修改。

JFinal

2016-11-30 13:21

前面手误打错了,应该是用 JFinalJson.getJson().toJson(...) 以及 FastJson.getJson().toJson(...) 这两个方法试一下,打印单个对象,与多条记录

raoda825

2016-11-30 13:24

改成这样打印:
System.out.println(JFinalJson.getJson().toJson(list.get(0)));
System.out.println(JFinalJson.getJson().toJson(list));

结果还是一样。
结果:
["2016-10-28 01:02:28","",1,"7167","8333","2016-10-01","1","1.17",2,"足利ホールディングス","常陽銀行","東証1部","東証1部","2016/9/28 - 2016/9/30","アシカガホールディングス","ジョウヨウギンコウ","トウショウ","トウショウ"]

[["2016-10-28 01:02:28","",1,"7167","8333","2016-10-01","1","1.17",2,"足利ホールディングス","常陽銀行","東証1部","東証1部","2016/9/28 - 2016/9/30","アシカガホールディングス","ジョウヨウギンコウ","トウショウ","トウショウ"],["2016-10-28 01:02:28","",1,"3050","9855","2016-12-01","1","0.6",2,"DCMホールディングス","くろがねや","東証1部","東証2部","2016/11/28 - 2016/11/30","ディーシーエムホールディングス","クロガネヤ","トウショウ","トウショウ"]]

raoda825

2016-11-30 13:26

是不是序列化model类不行?
model类代码:
public class Merger extends BaseMerger {

public static final Merger dao = new Merger();
public static final String tableName = TableMapping.me().getTable(Merger.class).getName();


public static List getAllMerger(Date date){
if(date == null){
return new ArrayList();
}
String sql = " select * from " + tableName + " where tm >= ? ";
return Db.query(sql,date);
}




}

JFinal

2016-11-30 13:32

用 Db.final 而不是 Db.query 后者返回的数组

JFinal

2016-11-30 13:32

Db.find

raoda825

2016-11-30 13:46

用find确实是可以了。find 返回的是Record的List,query返回的是Model的List都是List集合为什么序列化结果不一样?个人觉得query方法应该用的更多一些。

raoda825

2016-11-30 13:47

如果要返回json带属性的话。那就只能返回Record的List的 进行处理了?

raoda825

2016-11-30 13:47

@JFinal 非常感谢。开源精神!!!

JFinal

2016-11-30 14:00

@raoda825 Db.find 系列的方法会将结果包装成 Recod 对象,而 Db.query 不包装对象,仅原样返回为 Object[] 数组,两者查询逻辑完全一样,仅仅对返回值的处理方式不同

JFinal

2016-11-30 15:43

@raoda825 你的 Model 中已然有了很多的 find 方法,并且这些 find 方法会将返回值直接封装成 Model,为啥还要用 Db.find(...) 呢? 直接在 model 中 find(...) 即可

raoda825

2016-11-30 17:47

@JFinal 是的,直接用model类的find更好。我改下。 :-)

热门反馈

扫码入社