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


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

  		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.41</version>
        </dependency>

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

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

列表对象转换

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

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

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

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

导入pom:


        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

使用情况

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

<form id="starNumForm">
    <c:forEach items="${curriculum}" var="cur">
        ${cur.courseName}
        <input name="courseName" type="hidden" value="${cur.courseName}">
        <input name="score" type="checkbox" value="4">
        <input name="score" type="checkbox" value="3">
        <input name="score" type="checkbox" value="2">
        <input name="score" type="checkbox" value="1">
    </c:forEach>
</form>

这里写图片描述

当然如果以这种形式直接将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;
    };

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

是不是就是一种类的思想了,我们只需要把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");
                }
            }
        })

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值