当前更新次数: 3次
第二次更新内容:
增加json对象转java对象的简便方法
修改了一些表述不准确的地方
第三次更新内容
增加对jQuery操作json的使用场景
修改了JSON.parse()表述,并增加eval介绍
- 调整界面排版
想必各位前后台程序员(媛), 日常少不了和JSON打交道, 笔者也是如此, 但是每次在使用JSON
的时候要么忘记API的使用, 要么整错了 故整理一个杂记以便日后方便查看
以下为了演示使用同一个JSON串 / 同一个JavaBean
String obj =
“{“order”:{“orderCode”:“123456”,“supply”:“123456”,“status”:“0”},”
+ ““sheets”:[{“orderCode”:“45689”,“goodsCode”:“test”,“num”:“1”}]
}”;
注:里面的order和sheets其实是可以转换为Java对象的json串 为了下面演示方便我都用obj代表这个json串
温馨提示:请阅读前一定记住这个obj的样子和内容 后面的json数据来源均来源于此,为了不影响您的阅读 请切记这一条
一、 JSONObject
1. JSONObject.toJsonString(a) 和 xxx.toJsonString() 区别
前者: 是将一个a对象转为json字符串, 使用的是静态方法调用
后者: 是将一个json对象以json格式输出, 一般用于JSONArray过渡操作 使用的是成员变量方法
区别在于:前者 参数可以是java对象也可以json对象, 后者只能是json对象,下面是demo
1.1 JSONObject.toJsonString(a)
Order order = new Order();
order.setOrderCode("111");
order.setSupply("222");
order.setStatus("00");
String json = JSONObject.toJSONString(order );
System.out.println(json);
结果:
{"orderCode":"111","status":"00","supply":"222"}
obj
解析成json对象
JSONObject object = JSONObject.parseObject(obj);
//object.getJSONObject(key);
String json = object.toJSONString();
System.out.println("原JSON:" + obj);
System.out.println(json);
结果
原JSON:{"order":{"orderCode":"123456","supply":"123456","status":"0"},"sheets":[{"orderCode":"45689","goodsCode":"test","num":"1"}] }
{"sheets":[{"num":"1","orderCode":"45689","goodsCode":"test"}],"order":{"orderCode":"123456","supply":"123456","status":"0"}}
看起来好像没啥用, 那么往下看
//获得这个obj对应json对象
JSONObject jsonObject = JSONObject.parseObject(obj);
//从这个对象中获取key为order的json对象
JSONObject orderObject = jsonObject.getJSONObject("order");
//将key为order的json对象转为java对象 orderObject.toJSONString()必须有这一步的过度
Order order = JSONObject.parseObject(orderObject.toJSONString(), Order.class);
System.out.println(order.getOrderCode());
结果:能输出说明转换成功
123456
JSONObject jsonObject = JSONObject.parseObject(obj);
//方法二 跳过这个过度操作 那么必须确保order对应json对象存在
Order order2 = jsonObject.getObject("order", Order.class);
System.out.println(order2.getOrderCode());
结果
123456
注: class参数除了九大Java对象还可以是数组、集合(这种方式只能间接获取集合,本质还是通过拿到数组然后转成List/Map)若要直接获得集合请看JSONArray的解析
JSONObject jsonObject = JSONObject.parseObject(obj);
String arraJson = jsonObject.getString("sheets");
System.out.println(arraJson);
结果
[{"num":"1","orderCode":"45689","goodsCode":"test"}]
不存在
keypublic String doLogin(@RequestBody JSONObject object, HttpSession session) throws Exception {
log.debug("处理登录---------->");
System.out.println(object.toJSONString());
SysUser user = object.toJavaObject(SysUser.class);
System.out.println(user);
}
结果
{"password":"test","loginCode":"test"}
注:这里说的不存在是 指没必要设置
比如前台js直接封装username和password参数 为json对象发给后台
四种方法
获得java集合对象,调用同一个方法,仅仅是str获取方式不同JSONObject jsonObject = JSONObject.parseObject(obj);
/* 通过JSONArray 直接拿到 */
//方法1
JSONArray sheetArray = jsonObject.getJSONArray("sheets");
List<Sheet> sheets1 = JSONArray.parseArray(sheetArray.toJSONString(), Sheet.class);
System.out.println(sheets1.get(0).getGoodsCode());
//方法2
String arrayStr = jsonObject.getString("sheets");
List<Sheet> sheets2 = JSONArray.parseArray(arrayStr, Sheet.class);
System.out.println(sheets2.get(0).getGoodsCode());
/* 通过JSONObject 间接拿到 */
//方法3
Sheet[] sheets3 = JSONArray.parseObject(arrayStr, Sheet[].class);
List<Sheet> asList2 = Arrays.asList(sheets3);
System.out.println(asList2.get(0).getOrderCode());
//方法4
Sheet[] sheets = jsonObject.getObject("sheets", Sheet[].class);
List<Sheet> asList = Arrays.asList(sheets);
System.out.println(asList.get(0).getOrderCode());
结果
test
test
45689
45689
这个是我平时总搞混JSON.stringify()和JSON.parse()
使用场景, 所以也特意记一下
1. JSON.stringify()使用场景
ajax
向后台传递JSON对象 那么必须用该方法进行包裹, 与此同时还必须传递参数:headers: {'Content-Type': 'application/json;charset=UTF-8'}
@requestbody注解
接收前台传来的JSON对象例如
$.ajax({
url: 'dologin',
type: 'POST',
data: JSON.stringify(param),//param是表单封装后的JSON对象
dataType : 'json',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
success: callBackForLogin
})
@RequestMapping("/dologin")
@ResponseBody
public String doLogin(@RequestBody JSONObject object) throws Exception {
2.JSON.parse()
使用场景: 当后台解析json的对象包含集合对象 或者说
前台打印当后台传来的json串是[Object object]形式, 需要通过JSON.parse()解析后,方能遍历里面的内容
注:更准确的说法: 如果解析json的对象本身如果是集合形式无所谓
例如:
public class RoleMenuEffectiveVo extends WebMenu {
@Getter
@Setter
private Boolean checked; //是否勾选
@Getter
@Setter
private Boolean isLeaf;
@Override
public String toString() {
return "RoleMenuEffectiveVo{" +
"checked=" + checked + ", menu:{" + super.toString() + "}";
}
}
此时如果后台发送的json串是RoleMenuEffectiveVo 的集合形式, 前台直接取出来使用即可,不需要任何操作, 前台可以直接for循环遍历
后台对象包含集合对象
@ToString
public class MenuVo {
@Getter
@Setter
private WebMenu mainMenu;
@Getter
@Setter
private List<WebMenu> subMenu;
}
这个时候, 前台接收后台传来的json对象后 必须使用JSON.parse()去解析它, 然后才能遍历
3. eval()
功能比JSON.parse() 更强大, 不过它属于不规范式解析, 也就是说即便json格式不那么标准, 它也能解析, 故不建议使用在生产环境中, 更多的是在开发时校验当使用JSON.parse()解析失败, eval()解析成功的 排错手段
目前我接触的有关JSON的高频操作就是这些, 后面遇到新的会继续更新本篇文章, 所以可以持续关注一下哦!