java动态修改 注解的值,控制对象转化为json字符串的字段是否序列化

定义一个对象使用@JSONField控制该对象属性是否需要序列化

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class A {
    @JSONField(serialize = false)
    private String extendParams;

    @JSONField(serialize = true)
    private String sad;
}

编写工具类

import com.alibaba.fastjson.annotation.JSONField;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;
import lombok.val;

/**
 * 动态操作注解属性
 * @since 2020年8月13日20:49:26
 */
public class AnnotationUtils<T> {
    /**
     * 查看注解属性
     * @param t
     * @param name
     * @return
     * @throws NoSuchFieldException
     */
    public Object getJSONFieldProp(T t, String name) throws NoSuchFieldException {
        Field field = t.getClass().getDeclaredField(name);
        JSONField annotation = field.getAnnotation(JSONField.class);
        val serialize = annotation.serialize();
        return serialize;
    }

    /**
     * 修改注解属性
     * @param t
     * @param value
     * @return
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public Object setJSONFieldProp(T t,String name, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field field = t.getClass().getDeclaredField(name);
        JSONField annotation = field.getAnnotation(JSONField.class);
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
        Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
        memberValues.setAccessible(true);
        Map map = (Map) memberValues.get(invocationHandler);
        map.put("serialize",value);
        val serialize = annotation.serialize();
        return serialize;
    }
}

测试

import com.alibaba.fastjson.JSON;

public class TT {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        AnnotationUtils<A> aAnnotationUtils = new AnnotationUtils<>();
        A a = new A();
        a.setExtendParams("exex");
        a.setSad("sadsad");

        Object extendParams = aAnnotationUtils.getJSONFieldProp(a, "extendParams");//查询注解的值
        System.out.println(extendParams.toString());
//        System.out.println(JSON.toJSONString(a));

        Object extendParams1 = aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值
        System.out.println(extendParams1.toString());
        System.out.println(JSON.toJSONString(a));
    }
}

去掉main里面的注解看看效果,这个好像是发生了jvm优化导致的问题。。。
注释第一个print 打印结果如下:

false
true
{"extendParams":"exex","sad":"sadsad"}

不注释第一个print 打印结果如下:

false
{"sad":"sadsad"}
true
{"sad":"sadsad"}

接下来我们在做一个测试

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        List<A> aList = new ArrayList<>();
        for(int i=0; i<10; i++){
            AnnotationUtils<A> aAnnotationUtils = new AnnotationUtils<>();
            A a = new A();
            a.setExtendParams("exex");
            a.setSad("sadsad");
            if(i%2 == 0) {
                aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值
            }
            aList.add(a);
        }
        System.out.println(JSON.toJSONString(aList));
    }

打印结果

[{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"}]

我本想用修改注解的方式来修改某个字段的序列化与不序列化,但是我发现注解是在class层面的并不是在对象层面。所以我的设想失败了。。

### 回答1: 可以使用 Jackson 库中的 @JsonSerialize 注解,将 List 转化Json。具体实现方式如下: 1. 定义一个 POJO ,包含一个 List 型的属性。 2. 在该属性上添加 @JsonSerialize 注解,指定使用 Jackson 库中的 ListSerializer 进行序列化。 3. 在 ListSerializer 中,重写 serialize 方法,将 List 转化Json。 示例代码如下: ``` public class MyObject { @JsonSerialize(using = ListSerializer.class) private List<String> myList; // getter 和 setter 方法 } public class ListSerializer extends JsonSerializer<List<?>> { @Override public void serialize(List<?> list, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartArray(); for (Object obj : list) { jsonGenerator.writeObject(obj); } jsonGenerator.writeEndArray(); } } ``` 这样,当使用 Jackson 库将 MyObject 对象转化Json 时,List 型的属性就会被正确地序列化为一个 Json 数组。 ### 回答2: 在Java中,我们可以使用注解将List转换为Json。首先,我们需要引入相应的依赖注解库,例如Jackson等。接下来,我们可以在List变量的前面加上相应的注解,例如@JsonProperty,用于指定Json中的字段名。同时,我们也可以使用@JsonFormat注解来指定日期等特殊型的格式化方式。 示例代码如下: ``` import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; public class ListToJsonExample { public static void main(String[] args) throws JsonProcessingException { List<Student> students = new ArrayList<Student>(); students.add(new Student("Alice", 18)); students.add(new Student("Bob", 20)); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(students); System.out.println(json); } static class Student { @JsonProperty("name") private String name; @JsonProperty("age") private int age; public Student(String name, int age) { this.name = name; this.age = age; } // Getter and Setter } } ``` 在以上示例中,我们定义了一个Student,其中使用了@JsonProperty注解来指定对应的字段名。然后,我们创建了一个Student的List,并添加了两个学生对象。接着,我们使用ObjectMapper将List转换为Json字符串,并打印输出。 上述代码的输出结果为: ``` [{"name":"Alice","age":18},{"name":"Bob","age":20}] ``` 从输出结果可以看出,我们成功将List转换为了对应的Json字符串。这样,我们就可以方便地将List对象转换为Json,以便于后续的数据传输和处理。 ### 回答3: 在Java中,我们可以使用注解将List转换为Json。首先,需要引入相关的库,如Jackson库。然后,我们可以在List的定义上使用注解,例如@JsonSerialize注解来指定序列化的方式,比如将List中的对象按照指定的格式进行序列化。 示例代码如下: ```java // 导入相关的库 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import java.util.List; // 定义一个,用于演示 public class MyClass { private List<String> myList; public List<String> getMyList() { return myList; } public void setMyList(List<String> myList) { this.myList = myList; } } // 创建对象并设置List的 MyClass myObject = new MyClass(); myObject.setMyList(Arrays.asList("value1", "value2", "value3")); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 创建一个简单模块,用于序列化List SimpleModule simpleModule = new SimpleModule(); // 设置List的序列化方式 simpleModule.addSerializer(List.class, new ToStringSerializer()); // 注册模块到ObjectMapper objectMapper.registerModule(simpleModule); // 将List转换为Json字符串 String json = objectMapper.writeValueAsString(myObject); System.out.println(json); ``` 上述代码中,我们使用了Jackson库中的ObjectMapper对象来进行序列化操作。通过创建一个简单模块,并设置List的序列化方式为ToStringSerializer,然后将该模块注册到ObjectMapper中,最后使用writeValueAsString方法将List转换为Json字符串。 最终的输出结果为:{"myList":["value1","value2","value3"]}。这就是将List转换为Json的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值