json字符串转换java自定义对象

json字符串转换java自定义对象

版权声明:转载请标明出处 谢谢 https://blog.csdn.net/chijiandi/article/details/81011369

2018-12-26
闲着重新看到了这篇就来补充net.sf.json主要是pom导入jar包有一个冲突的问题而且导入的比较乱,所以也可以用别的json工具类比如阿里的fastjson

  
            com.alibaba
            fastjson
            1.2.41
        

 
 
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

用法都大同小异
单个对象转换

   String json = "{\"courseName\":\"空乘英语\",\"score\":\"1\"}";
        T t = JSONObject.parseObject(json, T.class);

  • 1
  • 2
  • 3

列表对象转换

   String json = "[{\"courseName\":\"空乘英语\",\"score\":\"1\"},{\"courseName\":\"化学\",\"score\":\"2\"}]";
        List t = JSONArray.parseArray(json, T.class);

  • 1
  • 2
  • 3

T为自定义实体类,这里为

  public class T {
        private String courseName;
        private String score;
	...
	...
	省略get/set
	...
	...
}

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

在开发中有多次使用到net.sf.json.JSONObject与net.sf.json.JSONArray对一些json对象进行解析并转换成实体类的经验。
使用这个工具类如果不引入它依赖的jar报或者引入错误都会导致很多的问题,在这里记录一下,特别注意的是那个jdk15,因为这个jar包是有库名要求的,不加的话会导入失败。
重新关注到这个问题是在我同学让我帮忙解决一个问题的时候,我会在后面简单的说明一下这个工具类我是怎么用的。

导入pom:


        
            commons-collections
            commons-collections
            3.2.1
        
        
            commons-lang
            commons-lang
            2.5
        
        
            commons-logging
            commons-logging
            1.1.1
        
        
            net.sf.ezmorph
            ezmorph
            1.0.6
        
        
            net.sf.json-lib
            json-lib
            2.4
            jdk15
        

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

使用情况

简单的说一下项目需求,需要做一个学校的在线评分系统,在同一张页面中对多门课程进行一个星级的选择,并将这些数据传入后台处理。
前端页面可以很轻松的通过c:forEach列出所有课程并添加一个单选框,如下:

${cur.courseName}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里写图片描述

当然如果以这种形式直接将form编码格式化会是
courseName=%E7%A9%BA%E4%B9%98%E8%8B%B1%E8%AF%AD&score=1&courseName=%E5%8C%96%E5%AD%A6&score=4
后台如果定义两个String来接收当然也可以实现,(String courseName, String score)中得到的会是两个按逗号分割开的字符串

但这显然就违背了面向对象的思想,如果我们前端传过来的数据多了乱了,后台的逻辑处理是不是又会显得很复杂,数据与数据之间是不是容易导致出错。
所以前端传过来的应该是需要一个对象的json数据而不是两个简单的字符串。后台需要的是一个对象。

前端处理

所以我在前端对form表单提交的数据进行了一个简单的处理:
PS:这块处理的代码没过深的去考虑,可以尝试进行优化

 $.prototype.serializeObject = function () {
        var a, o, h, i, e;
        var t = [];
        var length = 0;
        a = this.serializeArray();
        o = {};
        h = o.hasOwnProperty;
        for (i = 0; i < a.length; i++) {
            e = a[i];
            if (!h.call(o, e.name)) {
                o[e.name] = e.value;
            } else {
                t.push(o);
                length++;
                i--;
                o = {};
            }
        }
        t.push(o);
        return t;
    };

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

这个方法的意思就是将表单数据格式化成一个对象,我们可以对比看一下效果。
这里写图片描述

是不是就是一种类的思想了,我们只需要把json数据格式化成String传递给后台即可。

  $.ajax({
            url: "/demo4/submit/subStar",
            data: {list: JSON.stringify($('#starNumForm').serializeObject())},
            contentType: "application/json",
            success: function (data) {
                if (data == "success") {
                    alert("OK");
                } else {
                    alert("No");
                }
            }
        })

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

传递给后台的数据:
[{“courseName”:“空乘英语”,“score”:“1”},{“courseName”:“化学”,“score”:“2”}]
后端处理

后端拿到这个字符串后就需要用到JSONArray.fromObject()来对数据进行处理,并调用JSONArray.toList将其转化为实体类集合,后面的操作就是类与对象的方式了。

  @RequestMapping("/subStar")
    @ResponseBody
    public String subStar(String list) {
        JSONArray jsonArray = JSONArray.fromObject(list);
        List courseScoreList = JSONArray.toList(jsonArray, CourseScore.class);
        return "success";
    }

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

JSONArray的对象取出来的就是一个JSONObject,同样也可以单独将其转化成实体类。

        

你可能感兴趣的:(字符串操作)