<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      「Java工具類」Jackson工具類,json字符串轉各種對象或者集合,工具類庫是使用spring推薦使用的jackson庫

      介紹語

      本博客主要是Java常用關鍵技術點,通用工具類的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技術分享;datax、kafka、flink等大數據處理框架的技術分享。文章會不斷更新,歡迎碼友關注點贊收藏轉發!

      望各位碼友點擊關注,沖1000粉。后面會錄制一些視頻教程,圖文和視頻結合,比如:圖書介紹網站系統、搶購系統、大數據中臺系統等。技術才是程序猿的最愛,碼友們沖啊

      如果碼友覺得代碼太長,可以從頭到尾快速掃射一遍,了解大概即可。覺得有用后再轉發收藏,以備不時之需。

      正文:

      可以毫不夸張的說每一個項目中都有json字符串轉對象或者對象轉json字符串,或者對象數組。我發現很多同事在用阿里的fastjson或者用谷歌的gson工具類,也有用jackson工具類。甚至一個項目同時用這三個工具類的都有,我也并沒有對這樣的事感到奇怪和禁止,畢竟每個程序猿的習慣不一樣,不能強求他們使用不熟悉的工具類。

      我自己是選擇了jackson工具類,然后自己進一步封裝了。這個工具類也是spring推薦的,拓展性很強。下面上幾個使用的例子:

      例子1

      普通對象轉json字符串

       TestBean tb = new TestBean();
       tb.setAddress("天安門廣場");
       tb.setName("老八");
       tb.setAge(12);
       String s = JacksonMapper.getInstance().toJson(tb);
       System.out.println(s);
       // 使用static方法
       System.out.println(JacksonMapper.toJsonString(tb));
       ?
       // 控制臺打印
       {"name":"老八","age":12,"address":"天安門廣場"}
       {"name":"老八","age":12,"address":"天安門廣場"}

      例子2

      普通json字符串轉對象

       // s = {"name":"老八","age":12,"address":"天安門廣場"}
       TestBean testBean = JacksonMapper.getInstance().fromJson(s, TestBean.class);
       System.out.println(testBean);
       ?
       // 控制臺打印
       TestBean{name='老八', age=12, address='天安門廣場'}

      例子3

      對象集合轉json字符串

       List<TestBean> list = new ArrayList<>();
       list.add(tb);
       list.add(tb1);
       s = JacksonMapper.getInstance().toJson(list);
       System.out.println(s);
       ?
       // 控制臺打印
       [{"name":"老八","age":12,"address":"天安門廣場"},{"name":"老八12","age":122,"address":"天安門廣場12"}]

      例子4

      json字符串轉對象集合

       // 方式一
       List<TestBean> testBeanList = JacksonMapper.getInstance().fromJson(s, List.class);
       System.out.println(testBeanList);
       ?
       // 方式二
       JavaType javaType = JacksonMapper.getInstance().createCollectionType(List.class, TestBean.class);
       testBeanList = JacksonMapper.getInstance().fromJson(s, javaType);
       System.out.println(testBeanList);
       ?
       // 方式三
       testBeanList = JacksonMapper.getInstance().convertValue(testBeanList, new TypeReference<List<TestBean>>() {});
       System.out.println(testBeanList);
       ?
       // 控制臺打印
       [{name=老八, age=12, address=天安門廣場}, {name=老八12, age=122, address=天安門廣場12}]
       [TestBean{name='老八', age=12, address='天安門廣場'}, TestBean{name='老八12', age=122, address='天安門廣場12'}]
       [TestBean{name='老八', age=12, address='天安門廣場'}, TestBean{name='老八12', age=122, address='天安門廣場12'}]

      例子5

      map轉json字符串

       Map<String, Object> map = new HashMap<>();
       map.put("code", 200);
       map.put("data", tb);
       ?
       String ms = JacksonMapper.getInstance().toJson(map);
       System.out.println(ms);
       ?
       // 控制臺打印
       {"code":200,"data":{"name":"老八","age":12,"address":"天安門廣場"}}

      例子中用到的TestBean實體類

       public class TestBean {
           private String name;
           private Integer age;
           private String address;
           ....get、set方法
       }

      工具類源碼:

       import com.fasterxml.jackson.annotation.JsonInclude.Include;
       import com.fasterxml.jackson.core.JsonGenerator;
       import com.fasterxml.jackson.core.JsonParser.Feature;
       import com.fasterxml.jackson.core.JsonProcessingException;
       import com.fasterxml.jackson.databind.*;
       import com.fasterxml.jackson.databind.util.JSONPObject;
       import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
       import org.slf4j.Logger;
       import org.slf4j.LoggerFactory;
       ?
       import java.io.IOException;
       import java.util.TimeZone;
       ?
       /**
        * json工具類封裝
        *
        */
       public class JacksonMapper extends ObjectMapper {
       ?
           private static final long serialVersionUID = 1L;
       ?
           private static Logger logger = LoggerFactory.getLogger(JacksonMapper.class);
       ?
           private static JacksonMapper mapper;
       ?
           private JacksonMapper() {
               this(Include.NON_EMPTY);
           }
       ?
           private JacksonMapper(Include include) {
               // 設置輸出時包含屬性的風格  
               if (include != null) {
                   this.setSerializationInclusion(include);
               }
               // 允許單引號、允許不帶引號的字段名稱  
               this.enableSimple();
               // 設置輸入時忽略在JSON字符串中存在但Java對象實際沒有的屬性  
               this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
               // 運行empty的屬性
               this.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
               // 空值處理為空串
               this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
                   @Override
                   public void serialize(Object value,
                           JsonGenerator jgen,
                           SerializerProvider provider) throws IOException, JsonProcessingException {
                       jgen.writeString("");
                   }
               });
       ?
               //this.registerModule(new SimpleModule().addSerializer(new MyBigDecimalDesirializer()));
       ?
               // 進行HTML解碼。  
               /*this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer<String>(){  
                   @Override  
                   public void serialize(String value, JsonGenerator jgen,  
                           SerializerProvider provider) throws IOException,  
                           JsonProcessingException {  
                       jgen.writeString(StringEscapeUtils.unescapeHtml4(value));  
                   }  
               }));  */
               // 設置時區  
               this.setTimeZone(TimeZone.getDefault());//getTimeZone("GMT+8:00")  
           }
       ?
           /**
            * 使用枚舉的toString函數來讀寫Enum,
            * 為False時使用Enum的name()函數來 讀寫Enum, 默認為False.
            * 注意本函數一定要在Mapper創建后, 所有的讀寫動作之前調用.
            */
           public JacksonMapper enableEnumUseToString() {
               this.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
               this.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
               return this;
           }
       ?
           /**
            * 支持使用Jaxb的Annotation,使得POJO上的annotation不用與Jackson耦合。
            * 默認會先查找jaxb的annotation,如果找不到再找jackson的。
            */
           public JacksonMapper enableJaxbAnnotation() {
               JaxbAnnotationModule module = new JaxbAnnotationModule();
               this.registerModule(module);
               return this;
           }
       ?
           /**
            * 允許單引號
            * 允許不帶引號的字段名稱
            */
           public JacksonMapper enableSimple() {
               this.configure(Feature.ALLOW_SINGLE_QUOTES, true);
               this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
               this.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true);
               return this;
           }
       ?
           /**
            * 創建只輸出非Null且非Empty(如List.isEmpty)的屬性到Json字符串的Mapper,建議在外部接口中使用.
            */
           public static JacksonMapper getInstance() {
               if (mapper == null) {
                   mapper = new JacksonMapper(Include.ALWAYS).enableSimple();
               }
               return mapper;
           }
       ?
           /**
            * 創建只輸出初始值被改變的屬性到Json字符串的Mapper, 最節約的存儲方式,建議在內部接口中使用。
            */
           public static JacksonMapper nonDefaultMapper() {
               if (mapper == null) {
                   mapper = new JacksonMapper(Include.NON_DEFAULT);
               }
               return mapper;
           }
       ?
           /**
            * 取出Mapper做進一步的設置或使用其他序列化API.
            */
           public ObjectMapper getMapper() {
               return this;
           }
       ?
           /**
            * Object可以是POJO,也可以是Collection或數組。
            * 如果對象為Null, 返回"null".
            * 如果集合為空集合, 返回"[]".
            */
           public String toJson(Object object) {
               try {
                   return this.writeValueAsString(object);
               } catch (IOException e) {
                   logger.warn("write to json string error:" + object, e);
                   return null;
               }
           }
       ?
           /**
            * 反序列化POJO或簡單Collection如List<String>.
            * <p>
            * 如果JSON字符串為Null或"null"字符串, 返回Null.
            * 如果JSON字符串為"[]", 返回空集合.
            * <p>
            * 如需反序列化復雜Collection如List<MyBean>, 請使用fromJson(String,JavaType)
            *
            * @see #fromJson(String, JavaType)
            */
           public <T> T fromJson(String jsonString, Class<T> clazz) {
               if (jsonString == null || jsonString.isEmpty()) {
                   return null;
               }
               try {
                   return this.readValue(jsonString, clazz);
               } catch (IOException e) {
                   logger.warn("parse json string error:" + jsonString, e);
                   return null;
               }
           }
       ?
           /**
            * 反序列化復雜Collection如List<Bean>, 先使用函數createCollectionType構造類型,然后調用本函數.
            *
            * @see #createCollectionType(Class, Class...)
            */
           @SuppressWarnings("unchecked")
           public <T> T fromJson(String jsonString, JavaType javaType) {
               if (jsonString == null || jsonString.isEmpty()) {
                   return null;
               }
               try {
                   return (T) this.readValue(jsonString, javaType);
               } catch (IOException e) {
                   logger.warn("parse json string error:" + jsonString, e);
                   return null;
               }
           }
       ?
           /**
            * 構造泛型的Collection Type如:
            * ArrayList<MyBean>, 則調用constructCollectionType(ArrayList.class,MyBean.class)
            * HashMap<String,MyBean>, 則調用(HashMap.class,String.class, MyBean.class)
            */
           public JavaType createCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
               return this.getTypeFactory().constructParametricType(collectionClass, elementClasses);
           }
       ?
           /**
            * 當JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
            */
           @SuppressWarnings("unchecked")
           public <T> T update(String jsonString, T object) {
               try {
                   return (T) this.readerForUpdating(object).readValue(jsonString);
               } catch (JsonProcessingException e) {
                   logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
               } catch (IOException e) {
                   logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
               }
               return null;
           }
       ?
           /**
            * 輸出JSONP格式數據.
            */
           public String toJsonP(String functionName, Object object) {
               return toJson(new JSONPObject(functionName, object));
           }
       ?
           /**
            * 對象轉換為JSON字符串
            *
            * @param object
            * @return
            */
           public static String toJsonString(Object object) {
               return JacksonMapper.getInstance().toJson(object);
           }
       ?
           /**
            * JSON字符串轉換為對象
            *
            * @param jsonString
            * @param clazz
            * @return
            */
           public static Object fromJsonString(String jsonString, Class<?> clazz) {
               return JacksonMapper.getInstance().fromJson(jsonString, clazz);
           }
       }

      鄙人編碼十年多,在項目中也積累了一些工具類,很多工具類在每個項目都有在用,很實用。大部分是鄙人封裝的,有些工具類是同事封裝的,有些工具類已經不記得是ctrl+c的還是自己封裝的了,現在有空就會總結項目中大部分的工具類,分享給各位碼友。如果文章中涉及的代碼有侵權行為請通知鄙人處理。

      計劃是先把工具類整理出來,正所謂工欲善其事,必先利其器。項目中不管是普通單體項目還是多模塊maven項目或是分布式微服務,一部分功能模塊都是可以重用的,工具類模塊就是其中之一。

      posted @ 2021-10-31 01:28  Java夜未眠  閱讀(293)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久亚洲精品11p| 日韩中文字幕av有码| 亚洲日韩久热中文字幕| 国产精品天天看天天狠| 亚洲av无码片在线播放| 精品麻豆国产色欲色欲色欲WWW| 麻豆国产97在线 | 欧美| 蜜桃草视频免费在线观看| 伊人久久大香线蕉综合观| 久久人妻公开中文字幕| 久久综合色之久久综合色| 国产精品久久久久久福利69堂| 狠狠躁夜夜躁人人爽天天5| 国产福利社区一区二区| 一女被多男玩喷潮视频| 深夜宅男福利免费在线观看| 国产精品亚洲А∨天堂免| 美乳丰满人妻无码视频| 高潮精品熟妇一区二区三区| 欧美人与动欧交视频| 亚洲国产美女精品久久久| 亚洲一二三区精品与老人| 色噜噜亚洲男人的天堂| 曰韩高清砖码一二区视频| 亚洲中文字幕日产无码成人片 | 亚洲日韩AV秘 无码一区二区| 99re视频在线| 永久免费av网站可以直接看的| 亚洲色大成网站www看下面| 成人AV无码一区二区三区| 天天影视色香欲综合久久| 农村乱色一区二区高清视频| av色综合久久天堂av色综合在| 国产成人99亚洲综合精品| 人妻精品动漫H无码中字| 99久久婷婷国产综合精品| 1769国内精品视频在线播放| 免费人妻无码不卡中文18禁| 国产永久免费高清在线| 与子敌伦刺激对白播放| 精品国产一区二区三区性色|