如果我有一个对象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. Openresty 进行限流的方法

    1.使用Openresty进行限流, 使用漏桶原理进行设计 和路由系统设计类似. LUA脚本去通过变量去redis取值,从redis中得到队列的大小.漏和桶的大小. 然后通过比较,队列大小与漏和桶进行 ...

  2. dos脚本1章

    第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在键盘上按下Ctr ...

  3. mysql新增用户并开启远程连接

    之前使用mysql一直使用root来连接登录数据库,现在想使用新的用户名来连接数据库,碰到数据连接不上的情况. 把这些记录下来,以备后用 1.首先,创建用户 CREATE USER 'xiazhenx ...

  4. ubuntu mariadb installation

    sudo apt-get install mariadb-server[sudo] password for wadmin: Reading package lists... DoneBuilding ...

  5. Centos7-跟踪用户操作记录并录入日志

    1. 添加bash全局配置文件: cd /etc/profile.d sudo -e vi log_command.sh 输入如下内容: export PROMPT_COMMAND='RETRN_VA ...

  6. pycharm 的配置

    装好了pycharm之后 一.新建项目:(两个接口) 或 出现下图便创建成功: 二.配置本地项目编译器:(每个项目都要配一次) 出现下图就配置成功了: 三.pycharm + linux 远程开发(此 ...

  7. 从原型链探究Javascript这么火的原因

    首先,此文是对于javascript原型链的一些私人见解,若能博君会心一笑,在下荣幸之至! 为了阐述我的理解,首先提前声明一些前置知识,欢迎指正: 栈内存和堆内存: 栈内存每个地址分配的地址长度较窄, ...

  8. .htaccess 文件来进行用户组的目录权限访问控制

    <IfModule rewrite_module>RewriteEngine onRewriteRule ^((?:bootstrap|css|img|js||MathJax|video) ...

  9. 银行家算法C++程序

    此程序在Windows10    CodeBlocks17.12环境下测试运行,其他编程环境未经测试! 作业需求↓↓↓↓↓↓ 运行效果图如下 (codeblocks下载地址http://www.cod ...

  10. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...