由于前台框架中对数据的格式要求很高,后台返回数据一旦不符合要求,表单就可能无法渲染得到,前台就会报错,这次在社银平台中,在json和map两种类型转换中花了很多时间。
1、JSON 对象
JSON 对象在花括号中书写,对象可以包含多个名称/值对,例如:
{ "firstName":"John" , "lastName":"Doe" }
2、JSON数组
JSON 数组在方括号中书写,数组可包含多个对象,例如:
对象 “employees” 是包含三个对象的数组,每个对象代表一条关于某人(有姓和名)的记录。
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
3、Map对应Json对象表示
rtnMap 的key和value都是String类型,对其赋值表示成与上例中Json对象存储数据相同的形式(最根本的数据类型还是不一样)
Map<String, String> rtnMap = new HashMap<String, String>();
rtnMap.put("firstName","John");
rtnMap.put( "lastName", "Doe");
4、Map对应Json数组表示
首先,Json数组表示数组中包含了多个对象,则Map应初始化为Map<String, Object> rtnMap = new HashMap<String, Object>();
,其value值为Object类型,完整表示代码为:
class Object{
String firstName;
String lastName;
}
public static void main(String[] args){
Object object1 =new Object();
Object object2=new Object();
Object object3=new Object();
Map<String, Object> rtnMap = new HashMap<String, Object>();
rtnMap.put("对象1",object1);
rtnMap.put("对象1", object2);
rtnMap.put("对象1", object3);
}
5、后台得到map之后转换成Json格式
后台的Map格式:(经过了两次new Gson().toJson(Map)操作)
Map<String, Object> selMap=commDAO.selectOne(KFSGL + "KFSGL_S", paramsMap); //得到sql查询得到的Map
String selString = new Gson().toJson(selMap); //将map转换成Json字符串格式
rtnMap.put("data",selString); //存入结果map
rtnMap.put("fhz", "1");
rtnMap.put("msg", "");
String rtnString = new Gson().toJson(rtnMap);//再次将map转换成Json字符串格式
注:只要是Map对象则经过一次new Gson().toJson(Map)操作,与前台的对应,要不然会出错,导致前台无法转换成Json格式,会出错。
String rtnString = new Gson().toJson(rtnMap);
6、前台得到rtnString 后Js如何处理
6.1 json.stringify()函数:将数组转换成 JSON 字符串;(前台传值—>后台之前处理成Json字符串形式,或者用于alert输出)
6.2 json.parse()函数:将JSON 字符串重新转换成数组;(后台—>前台获取之后处理成Json数组形式)
Service中得到的已经是字符串格式了,因此使用var result = JSON.parse(data);
将其转换成数组,使用 result.data;得到其从数据库取得的值,但是这里的 result.data还是json字符串格式,因此在此使用var con = JSON.parse(content);
将其转换成Json数组类型,这里的miniui渲染表单是通过Json数组进行渲染的。
注:若只有一个对象,表单中仅有一个input,用json对象即可,但很多情况下都有很多input文本框,信息不止一条,因此需要使用json数组。即:渲染识别的都是json对象,只是对象多少的问题,一个则是json对象格式,多个则是json数组格式
CFW.oAJax.doService('kfsglService.selectKfs', params, '' , function(data) { //联系Service中的转换进行理解
var result = JSON.parse(data);
var content = result.data;
var con = JSON.parse(content);
if (result.fhz == '1') {
var o = mini.decode(con);
form.setData(o);
form.unmask();
} else {
mini.alert(result.msg);
}
});