关于后台获取json的问题

用ajax post提交json:{"filterCondition":[{"unitCode":"0001","registralCode":"21603201152013120008","nextInspectingDate":"2018-11-01"},{"unitCode":"0001","registralCode":"21603201152013120009","nextInspectingDate":"2018-17-01"}]};

用String filterCondition  = HttpKit.readData(getRequest());

System.out.println(filterCondition);打印出来是:

filterCondition%5B0%5D%5BunitCode%5D=0001&filterCondition%5B0%5D%5BregistralCode%5D=21603201152013120008&filterCondition%5B0%5D%5BnextInspectingDate%5D=2018-11-01&filterCondition%5B1%5D%5BunitCode%5D=0001&filterCondition%5B1%5D%5BregistralCode%5D=21603201152013120009&filterCondition%5B1%5D%5BnextInspectingDate%5D=2018-17-01

请问有办法解析里面的内容吗?

评论区

JFinal

2017-03-10 15:30

看一下控制台的 jfinal action report 输出中的 Parameter 输出值是多少,然后走下一步

younkee

2017-03-10 16:54

@JFinal 请问如何配置jfinal action report?

widely

2017-03-10 16:56

我也遇到这个问题了, getPara("abc") 后台打印是null

younkee

2017-03-10 17:05

@JFinal 我已经将setDevMode设置为true了,但控制台没有report产生

JFinal

2017-03-10 17:23

@younkee 那就是没配置好日志,下载首页的 jfinal demo ,将其中的 log4j.jar 与 log4j.properites 文件直接 copy 到项目中使用

JFinal

2017-03-10 17:23

younkee

2017-03-10 17:36

@JFinal JFinal action report -------- 2017-03-10 17:35:36 ------------------------------
Controller : controller.VesselController.(VesselController.java:1)
Method : queryVesselListByDate
没有parameter

younkee

2017-03-10 20:19

@JFinal JFinal action report -------- 2017-03-10 20:17:31 ------------------------------
Controller : controller.VesselController.(VesselController.java:1)
Method : queryVesselListByDate
Parameter : filterCondition[0][unitCode]=0001 filterCondition[0][registralCode]=21603201152013120008 filterCondition[0][nextInspectingDate]=2018-11-01 filterCondition[1][unitCode]=0001 filterCondition[1][registralCode]=21603201152013120009 filterCondition[1][nextInspectingDate]=2018-17-01
这样如何解析啊?

younkee

2017-03-10 20:29

@JFinal $(function(){
//按钮单击时执行
$("#testAjax").click(function(){
var condition = {"filterCondition":[{"unitCode":"0001","registralCode":"21603201152013120008","nextInspectingDate":"2018-11-01"},{"unitCode":"0001","registralCode":"21603201152013120009","nextInspectingDate":"2018-17-01"}]};
$.ajax({
type: "post",
cache: false,
url: "vessel/queryVesselListByDate",
data: condition,
dataType: 'json',
//contentType: 'application/json;charset=utf-8',
success: function (data) {
$("#msg").html(data.pressureVesselList);
},
error: function (e) {
$("#msg").html(e.message);
}
});
});
});
必须把contentType: 'application/json;charset=utf-8',注释掉,但注释掉后HttpKit.readData(getRequest());和getPara("filterCondition");都拿不到值,可以通过Enumeration paraNames = getParaNames();
for(Enumeration e=paraNames;e.hasMoreElements();){
String thisName=e.nextElement().toString();
String thisValue=getPara(thisName);
System.out.println(thisName+"--------------"+thisValue);

}遍历。
JFinal action report -------- 2017-03-10 20:21:06 ------------------------------
Controller : controller.VesselController.(VesselController.java:1)
Method : queryVesselListByDate
Parameter : filterCondition[0][unitCode]=0001 filterCondition[0][registralCode]=21603201152013120008 filterCondition[0][nextInspectingDate]=2018-11-01 filterCondition[1][unitCode]=0001 filterCondition[1][registralCode]=21603201152013120009 filterCondition[1][nextInspectingDate]=2018-17-01
--------------------------------------------------------------------------------
如果注释不去掉,那么HttpKit.readData(getRequest());可以获取到filterCondition%5B0%5D%5BunitCode%5D=0001&filterCondition%5B0%5D%5BregistralCode%5D=21603201152013120008&filterCondition%5B0%5D%5BnextInspectingDate%5D=2018-11-01&filterCondition%5B1%5D%5BunitCode%5D=0001&filterCondition%5B1%5D%5BregistralCode%5D=21603201152013120009&filterCondition%5B1%5D%5BnextInspectingDate%5D=2018-17-01,但getParaNames和getPara都获取不到值,
JFinal action report -------- 2017-03-10 20:27:01 ------------------------------
Controller : controller.VesselController.(VesselController.java:1)
Method : queryVesselListByDate
--------------------------------------------------------------------------------
不知道什么原因

JFinal

2017-03-10 22:12

首先要确定一种参数传递方式,如果是表单的 key=value 形式,直接使用 getModel以及 getPara 系列就可以获取

如果确定使用 json 传递方式,那么使用 HttpKit.readData(getRequest()) 得到 jsonString 以后,再通过 FastJson.getJson().parse(jsonString, Xxx.class) 转成 java 对象即可

最后,要搞清楚一件事,如果参数出现在了 jfinal action report 的 Parameter 部分,那么千万不要认为是 json 传递方式,而仍然是 key=value 方式,只不过 value 部分的值是 jsonString,处理办法是:
String jsonString = getPara("filterCondition[0][unitCode]");
FastJson.getJson().parse(jsonString, ...)

从上面看到你的回复中的 Parameter 域中的数据,可以得知肯定是表单传递形式,但是 value 值中的数据并不是 json 格式,是错误的格式

最后的最后, javascript 是无法使用 json 传递方式的,只能是用 http 客户端程序才可以去传 json,这里所指的传值方式是指将数据当成是 http body 中内容,切记,切不要搞混

younkee

2017-03-11 11:57

@JFinal 非常感谢耐心及详细的指教,已搞定收枪。

hotsmile

2017-03-13 17:00

@JFinal,我问一下2.1版本,如果想用log4j2,该如何配置?

JFinal

2017-03-13 17:03

@hotsmile 扩展一下 Log 这个抽象类,然后实现 ILogFactory 接口,假定叫:MyLogFactory,最后通过 me.setLogFactory(new MyLogFactory())

参考已有的 JdkLog 实现非常容易写

热门反馈

扫码入社