使用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 ...
随机推荐
- my first homepage
<!DOCTYPE html><html><head><style type="text/css">p{ text-indent:2 ...
- [转载] java多线程总结(三)
转载自: http://www.cnblogs.com/lwbqqyumidi/p/3821389.html 作者:Windstep 本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题 ...
- dos脚本》
如上图,我们只要在dos界面中输入各种dos命令,即可实现相应的命令,下面分享下dos命令大全:net use ipipc$ " " /user:" " 建立I ...
- ADO.Net中DataSet的应用
一.知识点描述 1.DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.也就是说,即使断开数据链路,或者关闭数据库,Data ...
- mybatis 类创建流程
Configuration ---> XmlConfigBuilder ---> SqlSessionFactoryBuilder ---> SqlSessionFactory(Co ...
- 高吞吐低延迟Java应用的垃圾回收优化
高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...
- SQL动态长度行列转置
一,案列问题描述: 某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额.源数据表如下: FM::注册月份,CM: 下单月份, AMT:下单金额 期望得到如下统计 ...
- tomcat启动时报:IOException while loading persisted sessions: java.io.EOFException的解决方案 ZT
错误代码如下: 严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException ...
- python学习4---实现快速排序
1.QuickSort def Rand_Partition(A,p,r): """ 划分数组的元素下标q :param A: 数组 :param p: 数组左边界 :p ...
- Web测试常见问题点汇总
UI测试 [目标] 确保用户可以访问产品所提供的浏览功能.符合企业或行业标准,包含用户易用性,友好性.可操作性等 [关注点] 菜单.对话框以及上边的文字.按钮.错误提示.帮助信息.图标.位置等. [常 ...