使用jackson实现对象json之间的相互转换(spring boot)

时间:2021-12-06 23:08:39

之前的json转对象,对象转json。总是比较繁琐,不够简洁。自从接触到jackson之后,发现原来对象和json转换可以这么简单。拿一个天气预报的小例子来说明一下~如下图。【若是有小误,还望指正】

使用jackson实现对象json之间的相互转换(spring boot)

不说,直接上码~

首先,在pom.xml里弄好依赖

具体依赖需要上网去查找,咱用的是下面这个。

?
1
2
3
4
5
6
7
<!-- 对象转换成json引入如下依赖 -->
<!-- 文档:https://www.yiibai.com/jackson/jackson_first_application.html#article-start -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.4</version>
</dependency>

然后嘞,准备一个接口,

用来获取天气预报接口的数据

?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.lvfeng.tool.weather;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
 
/**
 * @author LvFeng
 * 来源:https://www.nowapi.com/
 * 文档:https://www.nowapi.com/api/weather.future
 * 接口服务器【请求头】:https://sapi.k780.com   http://api.k780.com
 * 每三个月一更新,需要定期更新
 */
public class WeatherAPI {
    /*
     * 00a.天气预报接口
     */
    public static final String APP_KEY_WEATHER = "你自己的key"; //KEY
    public static final String SIGN_WEATHER = "你自己的sign";   //SIGN
    /*
     * 001.获取一周的天气
     * @param 请求城市气象编码,请求APPKey,SignKey,返回数据格式
     * @return JSON
     * DOC:https://www.nowapi.com/api/weather.future
     * FORMAT:http://api.k780.com/?app=weather.future&weaid=1&appkey=APPKEY&sign=SIGN&format=json
     */
    public static String getWeatherWeek(String cityNumber,String ak,String sg,String returnFormat) throws Exception{
        String str = "http://api.k780.com/?app=weather.future&weaid="+cityNumber+"&appkey="+ak+"&sign="+sg+"&format="+returnFormat;
        URL url = new URL(str); //请求URL
        InputStream ins = url.openStream(); //打开输入流
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        try {
            byte buf[] = new byte[1024];
            int read = 0;
            while ((read = ins.read(buf)) > 0) {
                out.write(buf, 0, read);
            }
        } finally {
            if (ins != null) {
                ins.close();
            }
        }
        byte b[] = out.toByteArray( );
        return new String(b,"utf-8");   //转码
    }
}

插一嘴,简单粗暴的讲,[]就是数组,{}就是对象,我们测试接口过后,

返回的json字符串就像下面这个样子

?
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
28
/* {
 * "success":"1",
 * "result":[{
 *      "weaid":"1",
 *      "days":"2018-07-18",
 *      "week":"星期三",
 *      "cityno":"beijing",
 *      "citynm":"北京",
 *      "cityid":"101010100",
 *      "temperature":"32℃/25℃",
 *      "humidity":"0%/0%",
 *      "weather":"多云转小雨",
 *      "weather_icon":"http://api.k780.com/upload/weather/d/1.gif",
 *      "weather_icon1":"http://api.k780.com/upload/weather/n/7.gif",
 *      "wind":"东风",
 *      "winp":"<3级",
 *      "temp_high":"32",
 *      "temp_low":"25",
 *      "humi_high":"0",
 *      "humi_low":"0",
 *      "weatid":"2",
 *      "weatid1":"8",
 *      "windid":"10",
 *      "winpid":"395",
 *      "weather_iconid":"1",
 *      "weather_iconid1":"7"
 *  }, 这后面类似……
 */

然后我们根据这构建对象,根据这段json分析,这可能是俩对象,然后,一个对象是结果集数组[],一个对象是状态(是否成功),于是,

我拆成了下面两个对象

?
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
28
29
package com.lvfeng.tool.weather.pojo;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
 
/**
 * @author Administrator
 * 一周天气对象
 * DOC:https://blog.csdn.net/u010457406/article/details/50921632
 *     https://blog.csdn.net/jxchallenger/article/details/79293772
 */
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property ="success")
public class WeatherWeek {
    private String success; //是否成功
    private List<Result> result;  //结果集数组
 
    public String getSuccess() {
        return success;
    }
    public void setSuccess(String success) {
        this.success = success;
    }
    public List<Result> getResult() {
        return result;
    }
    public void setResult(List<Result> result) {
        this.result = result;
    }
}
?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package com.lvfeng.tool.weather.pojo;
/**
 * @author LvLvFeng
 * Weather子类,天气结果的返回值
 */
public class Result {
    private String weaid;   //本站【调用接口的这个站点】的城市ID编号
    private String days;    //日期
    private String week;    //周几
    private String cityno;  //城市编码
    private String citynm;  //城市名称
    private String cityid;  //城市气象ID【标准】
    private String temperature; //气温
    private String humidity;    //湿度【暂未使用】
    private String weather;     //天气
    private String weather_icon;    //白天的气象图标
    private String weather_icon1;   //夜间的气象图标
    private String wind;            //风向
    private String winp;            //风力
    private String temp_high;       //最高气温
    private String temp_low;        //最低气温
    private String humi_high;       //温度栏位【弃用】
    private String humi_low;        //湿度栏位【弃用】
    private String weatid;          //白天天气ID,可对照weather.wtype接口中weaid
    private String weatid1;         //夜间天气ID,可对照weather.wtype接口中weaid
    private String windid;          //风向ID(暂无对照表)
    private String winpid;          //风力ID(暂无对照表)
    private String weather_iconid;  //气象图标编号(白天),对应weather_icon 1.gif
    private String weather_iconid1; //气象图标编号(夜间),对应weather_icon1 0.gif
    public String getWeaid() {
        return weaid;
    }
    public void setWeaid(String weaid) {
        this.weaid = weaid;
    }
    public String getDays() {
        return days;
    }
    public void setDays(String days) {
        this.days = days;
    }
    public String getWeek() {
        return week;
    }
    public void setWeek(String week) {
        this.week = week;
    }
    public String getCityno() {
        return cityno;
    }
    public void setCityno(String cityno) {
        this.cityno = cityno;
    }
    public String getCitynm() {
        return citynm;
    }
    public void setCitynm(String citynm) {
        this.citynm = citynm;
    }
    public String getCityid() {
        return cityid;
    }
    public void setCityid(String cityid) {
        this.cityid = cityid;
    }
    public String getTemperature() {
        return temperature;
    }
    public void setTemperature(String temperature) {
        this.temperature = temperature;
    }
    public String getHumidity() {
        return humidity;
    }
    public void setHumidity(String humidity) {
        this.humidity = humidity;
    }
    public String getWeather() {
        return weather;
    }
    public void setWeather(String weather) {
        this.weather = weather;
    }
    public String getWeather_icon() {
        return weather_icon;
    }
    public void setWeather_icon(String weather_icon) {
        this.weather_icon = weather_icon;
    }
    public String getWeather_icon1() {
        return weather_icon1;
    }
    public void setWeather_icon1(String weather_icon1) {
        this.weather_icon1 = weather_icon1;
    }
    public String getWind() {
        return wind;
    }
    public void setWind(String wind) {
        this.wind = wind;
    }
    public String getWinp() {
        return winp;
    }
    public void setWinp(String winp) {
        this.winp = winp;
    }
    public String getTemp_high() {
        return temp_high;
    }
    public void setTemp_high(String temp_high) {
        this.temp_high = temp_high;
    }
    public String getTemp_low() {
        return temp_low;
    }
    public void setTemp_low(String temp_low) {
        this.temp_low = temp_low;
    }
    public String getHumi_high() {
        return humi_high;
    }
    public void setHumi_high(String humi_high) {
        this.humi_high = humi_high;
    }
    public String getHumi_low() {
        return humi_low;
    }
    public void setHumi_low(String humi_low) {
        this.humi_low = humi_low;
    }
    public String getWeatid() {
        return weatid;
    }
    public void setWeatid(String weatid) {
        this.weatid = weatid;
    }
    public String getWeatid1() {
        return weatid1;
    }
    public void setWeatid1(String weatid1) {
        this.weatid1 = weatid1;
    }
    public String getWindid() {
        return windid;
    }
    public void setWindid(String windid) {
        this.windid = windid;
    }
    public String getWinpid() {
        return winpid;
    }
    public void setWinpid(String winpid) {
        this.winpid = winpid;
    }
    public String getWeather_iconid() {
        return weather_iconid;
    }
    public void setWeather_iconid(String weather_iconid) {
        this.weather_iconid = weather_iconid;
    }
    public String getWeather_iconid1() {
        return weather_iconid1;
    }
    public void setWeather_iconid1(String weather_iconid1) {
        this.weather_iconid1 = weather_iconid1;
    }  
}

开始书写工具类,方便以后调用~

?
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
28
29
30
31
32
package com.lvfeng.tool.change; 
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
 
/**
 * @author LvLvFeng
 * 操作json的封装方法
 * use:jackson
 */
public class JSONChange {
    /*
     * 001.json转换成对象
     * @param:传入对象,json字符串
     * @return:Object
     */
    public static Object jsonToObj(Object obj,String jsonStr) throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();  
        return obj = mapper.readValue(jsonStr, obj.getClass());
    }
    /*
     * 002.对象转换成json
     * @param:传入对象
     * @return:json字符串
     */
    public static String objToJson(Object obj) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(obj);
    }
}

封装完成,写测试类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.lvfeng.tool.weather;
import com.lvfeng.tool.change.JSONChange;
import com.lvfeng.tool.weather.pojo.WeatherWeek;
public class TestWeather {
    public static void main(String[] args) throws Exception{
        //城市列表,ak,sg,返回格式
        String res = WeatherAPI.getWeatherWeek("1", WeatherAPI.APP_KEY_WEATHER, WeatherAPI.SIGN_WEATHER, "json");
        System.out.println("结果集" + res);
        String res2 = WeatherAPI.getNowWeather("1", WeatherAPI.APP_KEY_WEATHER, WeatherAPI.SIGN_WEATHER, "json");
        System.out.println("结果集2" + res2);
        WeatherWeek wea = (WeatherWeek)JSONChange.jsonToObj(new WeatherWeek(), res);
        System.out.println("是否成功?"+wea.getSuccess()+"结果集举例【城市名称】:"+wea.getResult().get(0).getCitynm());
        System.out.println("---------------------开始反转------------------");
        String jsonStr = JSONChange.objToJson(wea);
        System.out.println("反转结果:"+jsonStr);
    }
}

如上,就把查询天气预报的结果转换成俩对象了,然后我们操作对象~啦啦啦!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_37525899/article/details/81132069