如果我有一个对象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方法的更多相关文章

  1. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  2. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  3. 深入JAVA注解之方法注解

    以获取数据库连接为例,建立maven项目 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  4. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  5. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

  6. 深入浅析JAVA注解

    注解,相信大家都会知道,像@requestMapping,@Resource,@Controller等等的一些注解,大家都用过,那么,他的工具类你用过吗?下面就和大家一起来分享一下注解工具类. 注解的 ...

  7. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  8. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  9. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

随机推荐

  1. filter以及reduce的用法

    简单的写了就几个例子 # 删掉偶数 li = [1,2,3,4,5,6,7,8,9,10] print(list(filter( lambda x : not x % 2 ==0 ,li))) #保留 ...

  2. mdadm语法

    mdadm命令详解及实验过程   一.概念 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具,作者是Neil Brown 二.特点 ...

  3. ZT 解决Ubuntu下SublimeText3不能输入中文问题

    git clone https://github.com/lyfeyaj/sublime-text-imfix.git运行脚本 :cd sublime-text-imfix && ./ ...

  4. Element-ui 更新tableData 中 row的某一个属性时,没有更新视图的问题

    在一个报警音管理的页面中,每次点击试听的时候,需要把‘试听’ 更新为 ‘停止’, 起初我们给row.play=0时,显示为 试听,row.play=1时显示为停止, 但是在代码中每次为row.play ...

  5. 常用oracle可重复执行的脚本模板

    为保证脚本的可重复执行以及丢失,涉及到数据库环境的移植等,就会使用可重复执行脚本,此处仅提供相关一些模板 说明下:该脚本需要在命令窗口执行,而不是在SQL窗口执行 创建序的脚本 /** * 作者:zk ...

  6. 总结React写参数的几种方式

    1.在render方法内 class Text extends Component{ render(){ const data=[1,2,3]; return( { data.map((item,in ...

  7. mathematics of deep learning (paper reading)

    1.数学上,不变性 2.信息论上

  8. eclipse启动tomcat错误解决

    clipse启动tomcat报出下面的错误提示: 控制台: 九月 06, 2018 9:01:31 下午 org.apache.tomcat.util.digester.SetPropertiesRu ...

  9. jmeter 获取登录token

    1.在登录的请求下新建正则表达式,获取token 2.正则表达式的写法 注意:apply to 默认是选择第二个,但是有获取不到token的情况就选第一个 "accessToken" ...

  10. 企业级LNMP分离式部署

    安装MySQL数据库   安装步骤介绍 本例采用MySQL二进制安装包进行安装演示 (1) 创建mysql用户的账号   [root@mysql ~]# groupadd mysql [root@my ...