使用java注解实现toJson方法
如果我有一个对象user,它有几个属性,我想把该对象序列化成一个json字符串,怎么做?我怎么把这种类型的问题实现成一个函数?
注解类似于在被注解的对象上,添加一些简单的属性。在运行时解析这些属性,以实现不同的功能。
在以下代码中,我通过两种方式:1、在属性上添加注解;或者2、在类上添加注解。来实现这个功能。
为简化问题,我仅处理字段类型为String和ArrayList<String>的属性。
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap; class JsonFormaterTest{
public static void main(String[] args){
ArrayList<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("orange");
User user = new User("abc@163.com", "abc", fruits);
JsonFormater jf = new JsonFormater(user);
System.out.println(jf.toJson(1)); Person person = new Person("abc@163.com", "abc", fruits);
jf = new JsonFormater(person);
System.out.println(jf.toJson(2));
}
} class JsonFormater{
private Object object;
public JsonFormater(Object obj){
this.object = obj;
}
public ArrayList<ArrayList<String>> toJsonArr(){
Field[] fields = this.object.getClass().getDeclaredFields();
ArrayList<ArrayList<String>> json = new ArrayList<ArrayList<String>>();
for(Field field : fields){
if(field.isAnnotationPresent(JsonFieldFormat.class)){
JsonFieldFormat jff = (JsonFieldFormat) field.getAnnotation(JsonFieldFormat.class);
ArrayList<String> aFieldArr = new ArrayList<String>();
String fieldName;
if(jff.name().equals("")){
fieldName = field.getName();
}
else {
fieldName = jff.name();
}
aFieldArr.add(fieldName);
try {
if (jff.type().equals("String")) {
Field aField = this.object.getClass().getDeclaredField(field.getName());
aField.setAccessible(true);
String aFieldValue = (String) aField.get(this.object);
aFieldArr.add("\""+aFieldValue+"\"");
// Method aFieldMethod = this.object.getClass().getDeclaredMethod(fieldName, null);
// aFieldMethod.setAccessible(true);
// String aFieldValue = (String) aFieldMethod.invoke(this.object, null);
} else if (jff.type().equals("ArrayList")) {
Field aField = this.object.getClass().getDeclaredField(field.getName());
aField.setAccessible(true);
ArrayList<String> aFieldValue = (ArrayList<String>) aField.get(this.object);
String fieldValues = "[";
for (int i = 0; i < aFieldValue.size(); i++) {
String str = aFieldValue.get(i);
fieldValues = fieldValues + "\"" + str + "\"";
if(i!=aFieldValue.size()-1){
fieldValues = fieldValues + ",";
}
}
fieldValues = fieldValues + "]";
aFieldArr.add(fieldValues);
}
json.add(aFieldArr);
}
catch (Exception e){
//
}
}
else {
// System.out.println("unused field");
// System.out.println(field.getName());
}
}
return json;
}
public ArrayList<ArrayList<String>> toJsonArr2(){
Field[] fields = this.object.getClass().getDeclaredFields();
ArrayList<ArrayList<String>> json = new ArrayList<ArrayList<String>>();
if(this.object.getClass().isAnnotationPresent(JsonClassFormat.class)){
JsonClassFormat jcf = (JsonClassFormat) this.object.getClass().getAnnotation(JsonClassFormat.class);
String[] nameTypes = jcf.nameTypes();
int len = nameTypes.length;
int fieldLen = len/3;
HashMap<String, String> types = new HashMap<String, String>();
HashMap<String, String> aliasNames = new HashMap<String, String>();
for(int i=0;i<fieldLen;i++){
types.put(nameTypes[i*3], nameTypes[i*3+1]);
aliasNames.put(nameTypes[i*3], nameTypes[i*3+2]);
}
for(Field field : fields){
if(types.get(field.getName()) != null){
ArrayList<String> aFieldArr = new ArrayList<String>();
String fieldName;
if(aliasNames.get(field.getName()).equals("")){
fieldName = field.getName();
}
else {
fieldName = aliasNames.get(field.getName());
}
aFieldArr.add(fieldName);
try{
Field aField = this.object.getClass().getDeclaredField(field.getName());
aField.setAccessible(true);
if(types.get(field.getName()).equals("String")){
String aFieldValue = (String) aField.get(this.object);
aFieldArr.add("\""+aFieldValue+"\"");
}
else if(types.get(field.getName()).equals("ArrayList")){
ArrayList<String> aFieldValue = (ArrayList<String>) aField.get(this.object);
String fieldValues = "[";
for(int i=0;i<aFieldValue.size();i++){
String str = aFieldValue.get(i);
fieldValues = fieldValues + "\"" + str + "\"";
if(i!=aFieldValue.size()-1){
fieldValues = fieldValues + ",";
}
}
fieldValues = fieldValues + "]";
aFieldArr.add(fieldValues);
}
json.add(aFieldArr);
}
catch (Exception e){
//
}
}
else{
// System.out.println("unused field");
// System.out.println(field.getName());
}
}
}
return json;
}
public String toJson(int x){
ArrayList<ArrayList<String>> json;
if(x==1){
json = toJsonArr();
}
else{
json = toJsonArr2();
}
ArrayList<String> allFields = new ArrayList<String>();
for(int i=0;i<json.size();i++){
ArrayList<String> str = json.get(i);
allFields.add("\""+str.get(0)+"\":"+str.get(1)+"");
}
String jsonStr = "{";
for(int i=0;i<allFields.size();i++){
jsonStr = jsonStr + allFields.get(i);
if(i!=allFields.size()-1){
jsonStr = jsonStr + ",";
}
}
jsonStr = jsonStr + "}";
return jsonStr;
}
} @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface JsonFieldFormat {
String type() default "";
String name() default "";
} class User{
@JsonFieldFormat(type="String")
private String email;
@JsonFieldFormat(type="String", name="alias")
private String name;
@JsonFieldFormat(type="ArrayList")
private ArrayList<String> favFruits; private String otherField; public User(String email, String name, ArrayList<String> favFruits){
this.email = email;
this.name = name;
this.favFruits = favFruits;
}
} @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface JsonClassFormat {
String[] nameTypes();
} @JsonClassFormat(nameTypes={"email", "String", "", "name", "String", "alias", "favFruits", "ArrayList", ""})
class Person{
private String email;
private String name;
private ArrayList<String> favFruits; private String otherField; public Person(String email, String name, ArrayList<String> favFruits){
this.email = email;
this.name = name;
this.favFruits = favFruits;
}
}
使用java注解实现toJson方法的更多相关文章
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- JAVA 注解的几大作用及使用方法详解【转】
java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...
- 深入JAVA注解之方法注解
以获取数据库连接为例,建立maven项目 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- Java注解
Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...
- 深入浅析JAVA注解
注解,相信大家都会知道,像@requestMapping,@Resource,@Controller等等的一些注解,大家都用过,那么,他的工具类你用过吗?下面就和大家一起来分享一下注解工具类. 注解的 ...
- 19.Java 注解
19.Java注解 1.Java内置注解----注解代码 @Deprecated //不推荐使用的过时方法 @Deprecated ...
- Java注解入门
注解的分类 按运行机制分: 源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
随机推荐
- extract()函数,将selector对象中data的值取出来;extract_first()函数,将列表中第0个selector对象拿出来,然后取data的值。
- Delphi编程之爬取贴吧多页帖子图片
接着上一篇文章说一下我们如何爬取多页帖子的图片. 第一步,还是随便找个贴吧,这次我们就找图片相对较少的射雕英雄传吧. 把页面拉到最底下,在页码区域单击右键,选择检查. 在这里我们看到了页码的代码区域, ...
- 2018-计算机系机试(第二批)-A-最大数
单点时限: 1.0 sec 内存限制: 256 MB 输入 n 个整数,输出其中最大数的值. 例如:3 个整数 1 ,2 和 6 的最大值是 6 . 输入格式 每一行的第一个数是 n (1≤n≤20 ...
- react初学之render返回加括号的问题
刚在学习react的初始阶段,跑了一段代码 var Mydom = React.createClass({ render:function(){ return <div> <inp ...
- 非对称加密, 助记词, PIN, WIF
一钱包 1.1非对称加密, 助记词, PIN, WIF, 地址 1.1.1 非对称加密算法 非对称加密算法, 加密与解密使用不同的KEY, 我们分别称为私钥与公钥,其中可以通过私钥生成公钥 在比特币中 ...
- Xcode注释转文档appledoc使用
参考了一些大神的方法总算成功了记录一下少走弯路 1:安装appledoc 使用终端下载: 命令行: git clone git://github.com/tomaz/appledoc.git cd . ...
- .net 客户端调用java或.net webservice进行soapheader验证
.net 客户端调用java或.net webservice进行soapheader验证 最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservi ...
- hadoop day 6
1.为hive配置mysql数据库 conf/hive-site.xml <property> <name>javax.jdo.option.ConnectionURL< ...
- jQuery-3.事件篇---自定义事件
jQuery自定义事件之trigger事件 众所周知类似于mousedown.click.keydown等等这类型的事件都是浏览器提供的,通俗叫原生事件,这类型的事件是需要有交互行为才能被触发. 在j ...
- SQL函数语句
MyBatis实现模糊查询 1.${-}代替#{-} 2.把'%#{name}%'改为"%"#{name}"%" 3.使用sql中的字符串拼接函数 4.使用标签 ...