zoukankan      html  css  js  c++  java
  • 使用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;
    }
    }
     
  • 相关阅读:
    UIScrollerView遇到UINavigationController
    iOS 自动化打包
    最最基本的SQL常用命令
    导入样式表与外部样式表的区别
    jdk、jre、JVM的简单区别与联系
    JDBC驱动的四种类型
    将映射中的值进行排序并输出键
    Java优先级队列
    Java线程池
    Callable--创建有返回值的线程
  • 原文地址:https://www.cnblogs.com/zycjwdss/p/7645876.html
Copyright © 2011-2022 走看看