@JSONField(name = “XXX”)
记一次第三方请求,请求参数首字母大写的解决方法。
定义一个User类
import lombok.Data;
@Data
public class User {
private String name;
private String sex;
private int age;
}
实例一个user,将user JSON序列化输出:
public class UserTest {
public static void main(String[] args) {
User user=new User();
user.setAge(15);
user.setName("张三");
user.setSex("女");
System.out.println(JSONObject.toJSONString(user));
}
}
结果:
此时,假设user是第三方请求接口参数(本例以此为例)而对方接口必须是首字母大写或者其他要求可以使用@JSONField
注解,具体使用参数可以自己去了解,此处以name为例。
import lombok.Data;
import com.alibaba.fastjson.annotation.JSONField;
@Data
public class User {
private String name;
private String sex;
@JSONField(name = "Age")
private int age;
}
结果:
此外,@JSONField
还有许多的属性,见源码:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
int ordinal() default 0; //是根据fieldName的字母序进行序列的,你可以通过ordinal指定字段的顺序
String name() default ""; //序列化和反序列化时候的别名
String format() default ""; //用于字符串格式的日期转换
boolean serialize() default true; // 是否参与序列化
boolean deserialize() default true; //是否参与反序列化
SerializerFeature[] serialzeFeatures() default {}; //序列化选项 SerializerFeature.WriteNullNumberAsZero 如空Number填充0
Feature[] parseFeatures() default {}; //反序列化选项
String label() default ""; //标签,
boolean jsonDirect() default false; //当你有⼀个字段是json字符串的数据,你希望直接输出,⽽不是经过转义之后再输出。
Class<?> serializeUsing() default Void.class; // 属性的序列化类,可定制。可有现存的,比如本来是Long,序列化的时候转为String:serializeUsing= ToStringSerializer.class
Class<?> deserializeUsing() default Void.class; // 属性的反序列化类,可定制。
String[] alternateNames() default {}; //参与反序列化时候的别名
boolean unwrapped() default false; // 对象映射到父对象上。不进行子对象映射。简单而言,就是属性为对象的时候,属性对象里面的属性直接输出当做父对象的属性输出
String defaultValue() default ""; //设置默认值
}