(第三次更新)JSON杂记 均以demo展示 包括FastJson 频繁API使用解析 jQuery操作json 后台操作json

目录

  • 更新内容
  • 声明
  • FastJSON 高频API --demo
  • JQuery使用JSON
  • 未完待续

更新内容

当前更新次数: 3次

第二次更新内容:

  1. 增加json对象转java对象的简便方法
  2. 修改了一些表述不准确的地方

第三次更新内容

  1. 增加对jQuery操作json的使用场景
  2. 修改了JSON.parse()表述,并增加eval介绍
  3. 调整界面排版

声明

想必各位前后台程序员(媛), 日常少不了和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数据来源均来源于此,为了不影响您的阅读 请切记这一条


FastJSON 高频API --demo

一、 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"}
  • 1.2 xxx.toJsonString()
    这个是过度操作 因此我们先要拿到一个JSONObject通过下面这个方法
    JSONObject.parseObject(obj) 将obj解析成json对象
    OK下面开始演示
  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"}}

看起来好像没啥用, 那么往下看

  • 2. JSONObject.parse(String str, Class class)
    将字符串形式的json对象转为指定的java对象
  //获得这个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
  • 3. jsonObject.getObject(String str, Class class)
    将json中key为str的json对象转为指定的java对象 效果和上面等价,而且代码更少,估计是阿里设计者为了转换方便特意为之
  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的解析

  • 4. jsonObject.getString(String str)
    获得key为str对应的son字符串
  JSONObject jsonObject = JSONObject.parseObject(obj);
  String arraJson = jsonObject.getString("sheets");
  System.out.println(arraJson);

结果

[{"num":"1","orderCode":"45689","goodsCode":"test"}]
  • 5.jsonObject.toJavaObject(Class class)
    如果jsonObject仅仅就是简单的json对象 或者说不存在key
public 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对象发给后台


  • 二、JSONArray
  • 1. JSONObject.parseArray(String str, Class class)
  • 将key为str对应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

JQuery使用JSON

这个是我平时总搞混JSON.stringify()和JSON.parse()使用场景, 所以也特意记一下

1. JSON.stringify()使用场景

  • 1.1 如果通过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 {
  • 1.2 如果你通过alert(data) 接收后台返回结果时 发现形如[Object][Object]这样的形式, 那么你需要通过该方法获得其真实对象

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的高频操作就是这些, 后面遇到新的会继续更新本篇文章, 所以可以持续关注一下哦!

你可能感兴趣的:(java,JSON操作篇,后端)