給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例
JavaBean賦默認(rèn)值并轉(zhuǎn)Json字符串
今日在工作中整理dubbo接口的時(shí)候,有些接口參數(shù)類型是JavaBean類型的數(shù)據(jù),在整理的時(shí)候又想直接將JavaBean參數(shù)直接以默認(rèn)的json格式整理,于是想到如何將javaBean的默認(rèn)值 直接轉(zhuǎn)換成為 Json格式的數(shù)據(jù),避免自己手動(dòng)去拼寫json字符串。
此段代碼還有值得優(yōu)化的地方
暫時(shí)只支持Java基本數(shù)據(jù)類型的轉(zhuǎn)換,不支持javaBean中包含其他javaBean對(duì)象變量的轉(zhuǎn)換、也不支持List/Map等類型的轉(zhuǎn)換,后期有空想辦法優(yōu)化,大家如果有優(yōu)化好的代碼也可以拿出來分享
廢話不多說,直接上代碼
package com.up.util.tools;
import com.google.gson.Gson;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created by *** on 2017-3-29
* TIME 11:07.
*/
public class JavaBeanToJson {
public static String toJson(Class clazz) throws Exception {
Gson gson = new Gson();
String result = "";
if (clazz.equals(Map.class)) {
result = clazz.getName() + "\t" + gson.toJson(new HashMap<>());
} else {
Object object = clazz.newInstance();
object = getBean(object);
result = clazz.getName() + "\t" + gson.toJson(object);
}
return result;
}
private static <T> Object getBean(T object) throws Exception {
Class<?> classType = object.getClass();
//SqlRowSet srs = jdbcTemplate.queryForRowSet(sql);
Field[] fields = classType.getDeclaredFields();//得到對(duì)象中的字段
//每次循環(huán)時(shí),重新實(shí)例化一個(gè)與傳過來的對(duì)象類型一樣的對(duì)象
T objectCopy = (T) classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
Object value = null;
//根據(jù)字段類型決定結(jié)果集中使用哪種get方法從數(shù)據(jù)中取到數(shù)據(jù)
if (field.getType().equals(String.class)) {
value = "";
} else if (field.getType().equals(int.class) || field.getType().equals(Integer.class)) {
value = new Integer(0);
} else if (field.getType().equals(double.class) || field.getType().equals(Double.class)) {
value = new Double(0);
} else if (field.getType().equals(long.class) || field.getType().equals(Long.class)) {
value = new Long(0);
} else if (field.getType().equals(Date.class)) {
value = new Date();
} else if (field.getType().equals(Object.class)) {
value = new Object();
}
// 獲得屬性的首字母并轉(zhuǎn)換為大寫,與setXXX對(duì)應(yīng)
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String setMethodName = "set" + firstLetter
+ fieldName.substring(1);
if (fieldName.equals("serialVersionUID")) {
continue;
}
Method setMethod = classType.getMethod(setMethodName,
new Class[]{field.getType()});
setMethod.invoke(objectCopy, new Object[]{value});//調(diào)用對(duì)象的setXXX方法
}
return objectCopy;
}
}javaBean對(duì)象和Json格式字符串相互轉(zhuǎn)換
一般前后端開發(fā)都是使用json格式的字符串進(jìn)行交互的,所以javaBean對(duì)象轉(zhuǎn)化為json格式字符串和json格式字符串轉(zhuǎn)化為javaBean對(duì)象顯的很有必要。
下面介紹兩種方法:
一.使用Jackson工具類
1.pom依賴
<!--jackson 2.x版本依賴--> <dependency> ? ? <groupId>com.fasterxml.jackson.core</groupId> ? ? <artifactId>jackson-annotations</artifactId> ? ? <version>2.8.1</version> </dependency> <dependency> ? ? <groupId>com.fasterxml.jackson.core</groupId> ? ? <artifactId>jackson-core</artifactId> ? ? <version>2.8.6</version> </dependency> <dependency> ? ? <groupId>com.fasterxml.jackson.core</groupId> ? ? <artifactId>jackson-databind</artifactId> ? ? <version>2.8.6</version> </dependency> <!--junit依賴--> <dependency> ? ? <groupId>junit</groupId> ? ? <artifactId>junit</artifactId> ? ? <version>4.12</version> </dependency>
2.程序代碼
package com.john.json;?
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;?
import java.io.IOException;?
public class TestJackson {
?
? ? @Test
? ? public void testObjAndJson() throws IOException {?
? ? ? ? Dog dog = new Dog();
? ? ? ? dog.setName("櫻桃");
? ? ? ? dog.setAge(1);
? ? ? ? dog.setFood("小米");
?
? ? ? ? //創(chuàng)建Jackson高級(jí)對(duì)象
? ? ? ? ObjectMapper mapper = new ObjectMapper();
?
? ? ? ? //對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的json格式字符串
? ? ? ? String json = mapper.writeValueAsString(dog);?
? ? ? ? System.out.println(json);
?
? ? ? ? //json格式字符串轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象
? ? ? ? Dog dogBack = mapper.readValue(json, Dog.class);?
? ? ? ? System.out.println(dogBack.getName()+"--"+dogBack.getAge()+"--"+dogBack.getFood());?
? ? }
}二.使用Gson工具類
1.pom依賴
<!--gson依賴--> <dependency> ? ? <groupId>com.google.code.gson</groupId> ? ? <artifactId>gson</artifactId> ? ? <version>2.2.4</version> </dependency> <!--junit依賴--> <dependency> ? ? <groupId>junit</groupId> ? ? <artifactId>junit</artifactId> ? ? <version>4.12</version> </dependency>
2.程序代碼
package com.john.json;?
import com.google.gson.Gson;
import org.junit.Test;?
public class TestGson {
?
? ? @Test
? ? public void testObjAndJson() {?
? ? ? ? Dog dog = new Dog();
? ? ? ? dog.setName("妞妞");
? ? ? ? dog.setAge(3);
? ? ? ? dog.setFood("大米");
?
? ? ? ? //創(chuàng)建gson對(duì)象
? ? ? ? Gson gson = new Gson();
?
? ? ? ? //對(duì)象轉(zhuǎn)化為對(duì)應(yīng)的json格式字符串
? ? ? ? String dogJson = gson.toJson(dog);?
? ? ? ? System.out.println(dogJson);
?
? ? ? ? //json格式字符串轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象
? ? ? ? Dog dogBack = gson.fromJson(dogJson, Dog.class);?
? ? ? ? System.out.println(dogBack.getName()+"--"+dogBack.getAge()+"--"+dogBack.getFood());
? ? }?
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳細(xì)總結(jié)Java創(chuàng)建文件夾的方法及優(yōu)缺點(diǎn)
很多小伙伴都不知道如何用Java創(chuàng)建文件夾,今天給大家整理了這篇文章,文中有非常詳細(xì)的方法介紹及方法的優(yōu)缺點(diǎn),對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
SpringBoot自動(dòng)配置Quartz的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot自動(dòng)配置Quartz的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
SpringBoot使用JPA實(shí)現(xiàn)查詢部分字段
這篇文章主要介紹了SpringBoot使用JPA實(shí)現(xiàn)查詢部分字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java中String、StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了Java中String、StringBuffer和StringBuilder的區(qū)別,StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串char[]value但是沒有final關(guān)鍵字修飾,所以這兩個(gè)可變,需要的朋友可以參考下2024-01-01
解讀Eureka的TimedSupervisorTask類(自動(dòng)調(diào)節(jié)間隔的周期性任務(wù))
在Eureka客戶端中,盡管ScheduledExecutorService的schedule方法創(chuàng)建的是一次性任務(wù),但通過在任務(wù)執(zhí)行完畢后再次調(diào)用schedule方法實(shí)現(xiàn)了周期性執(zhí)行,這種設(shè)計(jì)既考慮到了任務(wù)超時(shí)導(dǎo)致的間隔時(shí)間調(diào)整,又通過CAS實(shí)現(xiàn)了多線程同步,展現(xiàn)了簡潔而巧妙的設(shè)計(jì)思想2024-11-11

