JSON杂记 均以demo展示 包括FastJson 频繁API使用解析 jQuery操作json 后台操作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

  Order order = new Order();
  order.setOrderCode("111");
  order.setSupply("222");
  order.setStatus("00");
  String json = JSONObject.toJSONString(order  );
  System.out.println(json);
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

{"orderCode":"111","status":"00","supply":"222"}

    
    
  • 1
  JSONObject object = JSONObject.parseObject(obj);
  //object.getJSONObject(key);
  String json = object.toJSONString();
  System.out.println("原JSON:" + obj);
  System.out.println(json);
  
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

结果

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"}}

    
    
  • 1
  • 2

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

  //获得这个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());

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:能输出说明转换成功

123456
    
    
      JSONObject jsonObject = JSONObject.parseObject(obj);
      //方法二  跳过这个过度操作 那么必须确保order对应json对象存在
      Order order2 = jsonObject.getObject("order", Order.class);
      System.out.println(order2.getOrderCode());
        
        
    • 1
    • 2
    • 3

    结果

    123456
        
        

      注: class参数除了九大Java对象还可以是数组、集合(这种方式只能间接获取集合,本质还是通过拿到数组然后转成List/Map)若要直接获得集合请看JSONArray的解析

        JSONObject jsonObject = JSONObject.parseObject(obj);
        String arraJson = jsonObject.getString("sheets");
        System.out.println(arraJson);
          
          
      • 1
      • 2

      结果

      [{"num":"1","orderCode":"45689","goodsCode":"test"}]
          
          
        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);
        }
            
            
        • 1
        • 2
        • 3
        • 4
        • 5

        结果

        {"password":"test","loginCode":"test"}
            
            

          注:这里说的不存在是 指没必要设置
          比如前台js直接封装username和password参数 为json对象发给后台


          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());

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23

          结果

          test
          test
          45689
          45689
          
           
           
          • 1
          • 2
          • 3
          • 4

          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
          })
           
           
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 后端接收:
            @RequestMapping("/dologin")
            @ResponseBody	
             public String doLogin(@RequestBody JSONObject object) throws Exception {
           
           
          • 1
          • 2
          • 1.2 如果你通过alert(data) 接收后台返回结果时 发现形如[Object][Object]这样的形式, 那么你需要通过该方法获得其真实对象

          2.JSON.parse()
          使用场景: 当后台解析json的对象包含集合对象 或者说前台打印当后台传来的json串是[Object object]形式, 需要通过JSON.parse()解析后,方能遍历里面的内容

          注:更准确的说法: 如果解析json的对象本身如果是集合形式无所谓

          例如:

          • 后台对象不包含结合对象, 但却是集合形式
          public class RoleMenuEffectiveVo extends WebMenu {
          
          <span class="token annotation punctuation">@Getter</span>
          <span class="token annotation punctuation">@Setter</span>
          <span class="token keyword">private</span> Boolean checked<span class="token punctuation">;</span>        <span class="token comment">//是否勾选</span>
          
          <span class="token annotation punctuation">@Getter</span>
          <span class="token annotation punctuation">@Setter</span>
          <span class="token keyword">private</span> Boolean isLeaf<span class="token punctuation">;</span>
          
          <span class="token annotation punctuation">@Override</span>
          <span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
              <span class="token keyword">return</span> <span class="token string">"RoleMenuEffectiveVo{"</span> <span class="token operator">+</span>
                      <span class="token string">"checked="</span> <span class="token operator">+</span> checked <span class="token operator">+</span> <span class="token string">", menu:{"</span> <span class="token operator">+</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"}"</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span>
          

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15

          此时如果后台发送的json串是RoleMenuEffectiveVo 的集合形式, 前台直接取出来使用即可,不需要任何操作, 前台可以直接for循环遍历

          后台对象包含集合对象

          @ToString
          public class MenuVo {
          
          <span class="token annotation punctuation">@Getter</span>
          <span class="token annotation punctuation">@Setter</span>
          <span class="token keyword">private</span> WebMenu mainMenu<span class="token punctuation">;</span>
          
          <span class="token annotation punctuation">@Getter</span>
          <span class="token annotation punctuation">@Setter</span>
          <span class="token keyword">private</span> List<span class="token generics function"><span class="token punctuation">&lt;</span>WebMenu<span class="token punctuation">&gt;</span></span> subMenu<span class="token punctuation">;</span>
          

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          这个时候, 前台接收后台传来的json对象后 必须使用JSON.parse()去解析它, 然后才能遍历

          3. eval()

          功能比JSON.parse() 更强大, 不过它属于不规范式解析, 也就是说即便json格式不那么标准, 它也能解析, 故不建议使用在生产环境中, 更多的是在开发时校验当使用JSON.parse()解析失败, eval()解析成功的 排错手段


          未完待续

          目前我接触的有关JSON的高频操作就是这些, 后面遇到新的会继续更新本篇文章, 所以可以持续关注一下哦!

          评论
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值