评论

收藏

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

编程语言 编程语言 发布于:2022-01-13 16:24 | 阅读数:654 | 评论:0

这篇文章主要介绍了使用jackson实现对象json之间的相互转换(spring boot),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录

  • 首先,在pom.xml里弄好依赖
  • 用来获取天气预报接口的数据
  • 返回的json字符串就像下面这个样子
  • 我拆成了下面两个对象
  • 开始书写工具类,方便以后调用~
  • 封装完成,写测试类
之前的json转对象,对象转json。总是比较繁琐,不够简洁。自从接触到jackson之后,发现原来对象和json转换可以这么简单。拿一个天气预报的小例子来说明一下~如下图。【若是有小误,还望指正】
DSC0000.png

不说,直接上码~

首先,在pom.xml里弄好依赖
具体依赖需要上网去查找,咱用的是下面这个。
<!-- 对象转换成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>
然后嘞,准备一个接口,

用来获取天气预报接口的数据
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字符串就像下面这个样子
/* {
 * "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分析,这可能是俩对象,然后,一个对象是结果集数组[],一个对象是状态(是否成功),于是,

我拆成了下面两个对象
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;
  }
}
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;
  }   
}
开始书写工具类,方便以后调用~
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);
  }
}
封装完成,写测试类
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);
  }
}
如上,就把查询天气预报的结果转换成俩对象了,然后我们操作对象~啦啦啦!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/qq_37525899/article/details/81132069

关注下面的标签,发现更多相似文章