Fastjson中关于json的处理与配置

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

一、导入依赖:

在maven项目的pom文件中直接配置fastjson依赖,fastjson最新版本都会发布到maven中央仓库,你可以直接依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>x.x.x</version>
</dependency>

其中x.x.x是版本号,根据需要使用特定版本,建议使用最新版本。

二、Fastjson 主要的API 

主要的3个类,JSON、JSONArray、JSONObject。JSONObject和JSONArray继承JSON。
JSONObject代表json对象,JSONArray代表json对象数组,JSON代表JSONObject和JSONArray的转化。

对于JSON、JSONArray、JSONObject我的理解:
JSON提供了基本的转换方法,例如
        JSON.toJSONString:将java对象转换为json字符串
        JSON.parseObject:json字符串转换为指定java对象或转换为列表或者转换为JSONObject对象
        JSON.parseArray:json字符串转换为JSONArray。

而JSONObject对象继承了JSON,且实现了Map类。所以JSONObject是进一步封装类,这个类的主要作用就是,将Json字符串转换为JSONObject对象之后,实际上就相当于将Json字符串转换成了Map类型的key-value的格式,所以提供了很多丰富的api,可以让我们像操作Map对象那样,去操作JSONObject。例如去获得json字符串中某个属性,或某个节点下的属性。

JSONArray对象也继承了JSON,但是实现了List类,所以JOSNArray也是经过进一步的封装,这个类的主要作用就是,将Json字符串转换为JSONArray之后,实际上就相当于转换成了List类型的,提供了很多像操作List那样的api,例如判断该列表是否为空,或者获取某个索引下的属性。

所以我们使用fastObject时,如果只需要简单的转换,我们直接使用JSON类中的转换方法即可,但是如果需要更加细致的操作,例如直接获取json字符串中某个属性或者某个节点下的属性,可以进一步转换为JSONObject或者JSONArray来操作会更方便。

常用操作方法:

序列化
String jsonString = JSON.toJSONString(obj);
String jsonString = JSON.toJSONString(obj,true);//格式化输出
反序列化:
VO vo = JSON.parseObject("…", VO.class);
泛型反序列化:
import com.alibaba.fastjson.TypeReference; List list = JSON.parseObject("…", new TypeReference<List>() {});

   //对象转换为Json字符串Student student = new Student("姓名", null, LocalDateTime.now());String s = JSON.toJSONString(student);System.out.println("对象转json:"+s);//列表转json字符串List<Student> students = new ArrayList<>();students.add(new Student("姓名","年龄",LocalDateTime.now()));students.add(new Student("姓名","年龄",LocalDateTime.now()));students.add(new Student("姓名","年龄",LocalDateTime.now()));String s1 = JSON.toJSONString(students);System.out.println("List转json:"+s1);//Map类型转字符串Map<Integer,Student> map = new HashMap<>();map.put(1,new Student("姓名","年龄",LocalDateTime.now()));map.put(2,new Student("姓名","年龄",LocalDateTime.now()));map.put(3,new Student("姓名","年龄",LocalDateTime.now()));String s2 = JSON.toJSONString(map);System.out.println("Map转json:"+s2);//Map类型中有List 转字符串Map<Integer,List<Student>> map1 = new HashMap<>();map1.put(1,students);map1.put(2,students);map1.put(3,students);String s3 = JSON.toJSONString(map1);System.out.println("Map中含有List转json:"+s3);//json转换为对象Student student1 = JSON.parseObject("{\"age\":\"性别\",\"name\":\"姓名\",\"time\":\"2023-12-22T11:01:32.870\"}", Student.class);System.out.println("json转换为对象:"+student1);//json转换为List//使用parseObjectList<Student> studentList = JSON.parseObject("[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"}]", new TypeReference<List<Student>>() {});System.out.println("json转换为List:"+studentList);//使用parseArrayList<Student> studentList1 = JSON.parseArray("[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T14:00:30.592\"}]", Student.class);System.out.println("json转换为List:"+studentList1);//json转Map//使用parseObjectMap<Integer, Student> map2 = JSON.parseObject("{1:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"},2:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"},3:{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:10:57.807\"}}", new TypeReference<Map<Integer, Student>>() {});System.out.println("json转Map:"+map2);

对象转json:{"name":"姓名","time":"2023-12-22T15:28:18.474"}


List转json:[{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"}]


Map转json:{1:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"},2:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"},3:{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.927"}}


Map中含有List转json:{1:[{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"},{"age":"年龄","name":"姓名","time":"2023-12-22T15:28:18.925"}],2:[{"$ref":"$[1][0]"},{"$ref":"$[1][1]"},{"$ref":"$[1][2]"}],3:[{"$ref":"$[1][0]"},{"$ref":"$[1][1]"},{"$ref":"$[1][2]"}]}


json转换为对象:Student(name=姓名, age=性别, time=2023-12-22T11:01:32.870)


json转换为List:[Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592)]


json转换为List:[Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592), Student(name=姓名, age=年龄, time=2023-12-22T14:00:30.592)]


json转Map:{1=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807), 2=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807), 3=Student(name=姓名, age=年龄, time=2023-12-22T15:10:57.807)}

  

三、Fastjson方法总结:

Json相关方法:

1、parse():将json转换成object,也可以强转成指定类型与toJSON()方法类似
2、parseObject():将json字符串转成指定对象类型或者JSONObject
3、parseArray:将json字符串转成指定类型列表或者JSONArray
4、toJSON():将json字符串转换为Object类型,与parse()方法类似
5、toJavaObject():将JSONObject转换为指定对象类型,注意在使用JSON这个方法时,第一个参数是JSONObject类型的,而不是字符串类型。
6、toJSONBytes():将json字符出啊转换为字节数组
7、toJSONStringWithDateFormat()
:使用指定日期格式将 Java 对象序列化为 JSON 字符串,注意它可以是任意对象类型,也就是说将任意类型的参数传进去,会自动检测是否包含日期类Date或者LocalDateTime,然后进行自动转换。
8、isValid():检查 JSON 字符串是否合法。(已弃用)

        String str = "{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"}";String arrayStr = "[{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"},{\"age\":\"年龄\",\"name\":\"姓名\",\"time\":\"2023-12-22T15:51:01.993\"}]";//parse将对象转换为StringObject parse = JSON.parse(arrayStr);//parseObject转换为java对象,如果不指定对象类型,就转换为JSONObject类型,如果指定 就转换为指定类型JSONObject jsonObject = JSON.parseObject(str);Student student = JSON.parseObject(str, Student.class);//parseArray转换为列表,如果不指定列表类型,就转换为List类型,如果指定 就转换为指定类型列表JSONArray jsonArray = JSON.parseArray(arrayStr);List<Student> students = JSON.parseArray(arrayStr, Student.class);//toJSON,转换为Object,也可以强制转换为某种类型Object o = JSON.toJSON(student1);JSONObject o1 =  (JSONObject)JSON.toJSON(student1);//toJavaObject,将JSONObject转换为指定的java对象JSONObject jsonObject1 = JSON.parseObject(str);Student student4 = JSON.toJavaObject(jsonObject1, Student.class);//toJSONBytes,将java对象转换为字节数组byte[] bytes = JSON.toJSONBytes(student1);//oJSONStringWithDateFormat()//转换为JSONObject类型JSONObject jsonObject = new JSONObject();jsonObject.put("name", "David");jsonObject.put("birthDate", LocalDateTime.now());String jsonString = JSON.toJSONStringWithDateFormat(jsonObject, "yyyy-MM-dd");System.out.println(jsonString);//转换StudentString jsonString = JSON.toJSONStringWithDateFormat(new Student("姓名","年龄",LocalDateTime.now()), "yyyy-MM-dd");System.out.println(jsonString);
JSONObject相关方法:

JSONObject转换成字符串:
1. toJSONString():将 Java 对象序列化为 JSON 字符串。(与JSON中的方法类似,JSON中的方法是将JSONObject对象序列化为字符串,这个是直接序列化为字符串)。

JSONObject删除、判断相关方法:
2. size():获取 JSON 对象或数组的元素数量。
3. remove():从 JSON 对象中删除指定的键。
4. clear():清空 JSON 对象中的所有键值对。
5. isEmpty():检查 JSON 对象是否为空。
6. containsKey():检查 JSON 对象是否包含指定的键。
7. containsValue(Object value): 检查 JSON 对象是否包含指定的值

        Student student = new Student("姓名","年龄",LocalDateTime.now(),true);JSONObject jsonObject = (JSONObject)JSON.toJSON(student);System.out.println("jsonObject:"+jsonObject);System.out.println("toJavaString:"+jsonObject.toJSONString());System.out.println("size:"+jsonObject.size());System.out.println("isEmpty:"+jsonObject.isEmpty());System.out.println("containsKey:"+jsonObject.containsKey("age"));System.out.println("containsValue:"+jsonObject.containsKey("姓名"));jsonObject.remove("age");System.out.println("remove:"+jsonObject.toJSONString());jsonObject.clear();System.out.println("clear:"+jsonObject.toJSONString());


从JSONObject中获取key列表、value列表、key-value列表:
8. keySet():获取 JSON 对象的键集合。
9. values():获取 JSON 对象的值集合。
10. entrySet(): 获取 JSON 对象的键值对集合

        Student student = new Student("姓名","年龄",LocalDateTime.now(),true);JSONObject jsonObject = (JSONObject)JSON.toJSON(student);System.out.println("jsonObject:"+jsonObject);System.out.println("keySet:"+jsonObject.keySet());System.out.println("values:"+jsonObject.values());System.out.println("entrySet:"+jsonObject.entrySet());

JSONObject中添加key-value:
11. put(String key, Object value): 向 JSON 对象添加键值对
12. putAll(Map<? extends String, ? extends V> map): 向 JSON 对象中添加键值对
13. putAll(JSONObject m) : 将另一个 JSON 对象中的键值对添加到当前 JSON 对象
14. putIfAbsent(String key, Object value): 如果不存在键,则向 JSON 对象添加键值对

        Student student = new Student("姓名","年龄",LocalDateTime.now(),true);JSONObject jsonObject = (JSONObject)JSON.toJSON(student);System.out.println("jsonObject:"+jsonObject);System.out.println("put:"+jsonObject.put("new1","新添加1"));JSONObject jsonObject1 = new JSONObject();jsonObject1.put("new2","新添加2");jsonObject.putAll(jsonObject1);System.out.println("putAll(Map):"+jsonObject);Map map = new HashMap();map.put("new3","新添加3");jsonObject.putAll(map);System.out.println("putAll(Map):"+jsonObject);jsonObject.putIfAbsent("new1","新添加1");System.out.println("putIfAbsent:"+jsonObject);

JSONObject中获取相关方法:
16.getJSONObject()
:获取 JSON 对象中的子对象。
17. getJSONArray():获取 JSON 对象中的子数组。
18. get(Object key) : 获取 JSON 对象中的属性值
19. getInteger(String key): 获取 JSON 对象中的整数属性值
20. getLong(String key) : 获取 JSON 对象中的长整数属性值
21. getShort(String key) : 获取 JSON 对象中的短整数属性值
22. getByte(String key) : 获取 JSON 对象中的字节属性值
23. getFloat(String key): 获取 JSON 对象中的浮点数属性值
24. getDouble(String key) : 获取 JSON 对象中的双精度浮点数属性值
25. getBoolean(String key): 获取 JSON 对象中的布尔属性值
26. getBigDecimal(String key): 获取 JSON 对象中的 BigDecimal 属性值

        JSONObject jsonObject = new JSONObject();jsonObject.put("one",new Student("姓名","年龄",LocalDateTime.now(),true));List<Student> students = new ArrayList<>();students.add(new Student("姓名","年龄",LocalDateTime.now(),true));students.add(new Student("姓名","年龄",LocalDateTime.now(),true));jsonObject.put("two",students);jsonObject.put("three","string类型");jsonObject.put("four",true);System.out.println("getObject:"+jsonObject.getObject("one",Student.class));System.out.println("getJSONObject:"+jsonObject.getJSONObject("one"));System.out.println("getJSONArray:"+jsonObject.getJSONArray("two"));System.out.println("getString:"+jsonObject.getString("three"));System.out.println("getBoolean:"+jsonObject.getBoolean("four"));

 Java对象、JSONObject、json字符串相互转化:
        //java对象转JSONObjectStudent student = new Student("姓名","年龄",LocalDateTime.now(),true);JSONObject jsonObject = (JSONObject)JSON.toJSON(student);//java对象转json字符串String s = JSON.toJSONString(student);//JSONObject转java对象Student student1 = jsonObject.toJavaObject(Student.class);//JSONObject转JSONStringString s1 = jsonObject.toJSONString();//json字符串转java对象JSON.parseObject("{\"name\":\"姓名\",\"aboolean\":true,\"time\":\"2023-12-25T14:02:47.860\",\"age\":\"年龄\"}", Student.class);//json字符串转JSONObjectJSONObject jsonObject1 = JSON.parseObject("{\"name\":\"姓名\",\"aboolean\":true,\"time\":\"2023-12-25T14:02:47.860\",\"age\":\"年龄\"}");

JSONArray相关方法:

JSONArray就像是一个可以添加任意类型的列表,并不是只能存储json字符串。

1.toJavaList():将jsonArray转换为对应列表。

        List<Student> students = jsonArray.toJavaList(Student.class);

2.add():可以添加任意类型,相当于在列表中新增加一个元素
3.addAll():添加所有元素,可以是List类型,也可以是JSONArray.
4.contains():是否含有某个元素。
5.clear():清除列表。
6.clone():复制一个新列表。
7.size():列表元素总数
8..get():获取对应下标的元素
9.fluentAdd():流式添加,使用了这个之后,可以继续操作。

        two.fluentAdd("aaa").add("bbb");

10.remove():删除对应索引的数据。
11.获取对应类型:
getBoolean()、getJSONObject()、getJSONArray()、 getString();等等,对应类型都有。
12.isEmpty():是否为空。
13.也可以使用stream()流对其操作。
其他略,基本跟List操作类似。

Fastjson过滤器用法:
SimplePropertyPreFilter 用法:

  可以指定某些属性参与序列化、某些属性不参与序列化。

        Student student = new Student("姓名", "年龄", LocalDateTime.now());SimplePropertyPreFilter filter = new SimplePropertyPreFilter();//排除某些属性不序列化filter.getExcludes().add("name");System.out.println(JSON.toJSONString(student,filter));SimplePropertyPreFilter filter1 = new SimplePropertyPreFilter();//只序列化指定的属性filter1.getIncludes().add("name");System.out.println(JSON.toJSONString(student,filter1));
PropertyFilter用法:
SimplePropertyPreFilter 实现了 PropertyPreFilter ,也就是说我们可以自己实现过滤的逻辑例如:
        Student student = new Student("姓名", "年龄", LocalDateTime.now());//重新过滤逻辑,只序列化 name 属性值PropertyFilter propertyFilter = new PropertyFilter() {@Overridepublic boolean apply(Object object, String name, Object value) {if(name.equals("name")){return true;}return false;}};String json = JSON.toJSONString(student,propertyFilter);System.out.println(json);

类过滤器: 

fastjson提供类级别的SerializeFilter支持,也就是说,可以设置过滤器只对某些类序列化的时候生效。
例如只对Student类中的属性名转换成大写:

        Student student = new Student("姓名", "年龄", LocalDateTime.now());NameFilter nameFilter = new NameFilter() {@Overridepublic String process(Object object, String name, Object value) {return name.toUpperCase();}};// 对A类添加过滤器SerializeConfig.getGlobalInstance().addFilter(Student.class, nameFilter);String s = JSON.toJSONString(student);System.out.println(s);

或者指定Student类只序列化name属性:

        Student student = new Student("姓名", "年龄", LocalDateTime.now());//重新过滤逻辑,只序列化 name 属性值PropertyFilter propertyFilter = new PropertyFilter() {@Overridepublic boolean apply(Object object, String name, Object value) {if(name.equals("name")){return true;}return false;}};// 对A类添加过滤器SerializeConfig.getGlobalInstance().addFilter(Student.class, propertyFilter);String s = JSON.toJSONString(student);System.out.println(s);

ValueFilter: 

对value进行修改

        Student student = new Student("姓名", "年龄", LocalDateTime.now());//修改属性值为  字段名—属性值ValueFilter valueFilter = (object, name, value) -> name + "-" + value;SerializeConfig.getGlobalInstance().addFilter(Student.class, valueFilter);String s = JSON.toJSONString(student);System.out.println(s);

SerializeFilter:

以上的过滤器都实现了SerializeFilter:

 SerializeFilter · alibaba/fastjson Wiki · GitHub

四、fastjson中常用注解: 

@JSONField

使用fastjson进行需要对字段进行一些特殊处理,比如时间格式,前后端名字不一致,字段为null是否依然序列化等问题。那么fastjson的@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填充0Feature[] parseFeatures() default {}; //反序列化选项String label() default ""; //标签,boolean jsonDirect() default false; //当你有⼀个字段是json字符串的数据,你希望直接输出,⽽不是经过转义之后再输出。Class<?> serializeUsing() default Void.class; // 属性的序列化类,可定制。可有现存的,比如本来是Long,序列化的时候转为String:serializeUsing= ToStringSerializer.classClass<?> deserializeUsing() default Void.class; // 属性的反序列化类,可定制。String[] alternateNames() default {}; //参与反序列化时候的别名boolean unwrapped() default false; // 对象映射到父对象上。不进行子对象映射。简单而言,就是属性为对象的时候,属性对象里面的属性直接输出当做父对象的属性输出String defaultValue() default ""; //设置默认值
}

1、 几个基本属性:
ordinal :指定字段的顺序
name :序列化和反序列化时候的别名
serialize: 是否参与序列化
deserialize:是否参与反序列化
format:用于字符串格式的日期转换
defaultValue:设置默认值


示例:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {@JSONField(name = "NAME",ordinal = 1,serialize = true)private String name;@JSONField(name = "AGE",ordinal = 2,serialize = true,defaultValue = "默认的姓名")private String age;@JSONField(name = "JOB",ordinal = 3,serialize = false)private String job;@JSONField(name = "SEX",ordinal = 4,serialize = true)private String sex;@JSONField(name = "TIME",ordinal = 5,serialize = true ,format = "yyyy-MM-dd")private LocalDateTime time;
}
        Student student = new Student("姓名", null, "工作", "性别", LocalDateTime.now());System.out.println(JSON.toJSONString(student,true));

 正常输出:

加上上面注解之后:
 

2、serialzeFeatures、parseFeatures: 序列化、反序列化时候的一些可选的特征

序列化的时候比如fastjson默认是不会将为null的属性输出的,若是我们也想输出,可以加入@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 数值型为null的话,就输出0,可以使用@JSONField(serialzeFeatures = SerializerFeature.WriteNullNumberAsZero)

反序列化的时候,比如parser是否将允许使用非双引号属性名字。@JSONField(parseFeatures = Feature.AllowSingleQuotes)

示例:

        Student student = new Student("姓名", null, "工作", "性别", LocalDateTime.now());System.out.println(JSON.toJSONString(student,true));

 正常输出:

没有打印age的值,如果加上注解:

    //输出null,使用单引号@JSONField(serialzeFeatures = {SerializerFeature.WriteMapNullValue,SerializerFeature.UseSingleQuotes } )private String age;

输出了age的值,而且是单引号。
 

具体名称还包括:

PrettyFormat 

 

3、label:可以给属性设置标签,这样可以批量处理某一类的属性,比如不序列化某一类属性。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {@JSONField(label = "a")private String name;@JSONField(label = "a")private String age;@JSONField(label = "a")private String job;@JSONField(label = "b")private String sex;@JSONField(label = "b")private LocalDateTime time;
}
        Student student = new Student("姓名", null, "工作", "性别", LocalDateTime.now());System.out.println(JSON.toJSONString(student, Labels.includes("a"), SerializerFeature.PrettyFormat));System.out.println(JSON.toJSONString(student, Labels.includes("b"), SerializerFeature.PrettyFormat));System.out.println(JSON.toJSONString(student, Labels.includes("a","b"), SerializerFeature.PrettyFormat));

 

4、 jsonDirect:不经过转义直接输出:

    @JSONField(jsonDirect = true)private String name;
        Student student = new Student("{}", "年龄", "工作", "性别", LocalDateTime.now());System.out.println(JSON.toJSONString(student, SerializerFeature.PrettyFormat));

 正常输出:

加上注解之后:

 

5、serializeUsing和deserializeUsing:

可定制的序列化和反序列化的类,但是也有原生的。
比如原生:比如字段本来是Long,序列化的时候转为String。
比如自定义:我对某个字段加上我想要的处理结果“Chinese are Japanese fathers”

    @JSONField(serializeUsing = DemoController.MySerializer.class)private String name;@JSONField(serializeUsing = ToStringSerializer.class)private Integer age;
@RestController
@RequestMapping("/demo")
@Slf4j
public class DemoController {public static void main(String[] args) {Student student = new Student("{}", 22, "工作", "性别", LocalDateTime.now());System.out.println(JSON.toJSONString(student, SerializerFeature.PrettyFormat));}public static class MySerializer implements ObjectSerializer {@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {String text = "Chinese are Japanese fathers" + (String) object;serializer.write(text);}}
}

加上之后输出:

 

6、alternateNames:反序列化时候的别名

public class JSONController {public static void main(String[] args) {String str ="{\"Name\":\"汉族\",\"num\":2323}";System.out.println(JSON.toJSONString(JSON.parseObject(str, Nation.class)));//{"name":"汉族","num":2323}}}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {@JSONField(alternateNames = {"name", "Name"})private String name;private String dress;private Integer num;private Date celebrateHoliday;
}

 7、unwrapped

 对象映射到父对象上。不进行子对象映射。简单而言,就是属性为对象的时候,属性对象里面的属性直接输出当做父对象的属性输出,意思就是说有一个属性为对象时,直接将这个对象中的属性并入到父类属性中,也就是外层对象中。

示例:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private String name;private Integer age;@JSONField(unwrapped = true)private Job job;}
@Data@AllArgsConstructor@NoArgsConstructorpublic static class Job{private String jobName;private LocalDateTime jobNum;}
        Job job = new Job("工作名称", LocalDateTime.now());Student student = new Student("{}", 22, job);System.out.println(JSON.toJSONString(student, SerializerFeature.PrettyFormat));

正常输出:

加上注解后:
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例分析:三一重工集团数字化转型

三一重工集团&#xff0c;作为制造业中的数字化转型佼佼者&#xff0c;荣获“全球灯塔工厂”的殊荣&#xff0c;率先采用了物联网、云计算、大数据等尖端技术手段。数字化转型让三一重工步入了全面信息化的管理时代&#xff0c;通过ERP、CRM、HRM等系统的协同运作&#xff0c;实…

第十二章 集合类

12.1集合类概论 java.util包中提供了一些集合类&#xff0c;这些 集合类又被成为容器&#xff0c;提到容器不难想到数组。集合类于数组的不同之处是:数组的长度是固定的 但集合类不同长度是可变的&#xff1a;数组用来存放基本数据类型的数据&#xff0c;集合用来存放对象的引…

Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

Spring Cloud Vue前后端分离-第7章 核心业务功能开发 7-1 课程管理功能开发 课程管理页面美化 1.课程管理页面美化 demo-course.jpg 复制search.html中的部分代码 course.vue 看效果 测试一下新增修改删除效果 1.课程管理页面美化2 scoped:style下的样式只应用于当前组件…

docker的一些思考

1.docker是啥&#xff1f; 2.镜像执行流程 3.一些疑惑和解答 1. 2.

喜报频传!百望云获评“2023数字经济独角兽”称号

“数字经济独角兽”是在数字经济领域具备高成长性、高创新性和高潜力性的企业&#xff0c;他们不仅是数字经济的先锋&#xff0c;是科技创新型企业的典范&#xff0c;也是推动经济发展的新兴引擎。 12月20日&#xff0c;“2023数字经济独角兽大会”在北京大兴区成功举办。大会以…

关于Smartbi登录代码逻辑漏洞的动态情报

一、基本内容 近日&#xff0c;思迈特软件核查发现存在“登录代码逻辑漏洞”问题&#xff0c;重点影响范围涉及Smartbi V9及其以上版本。该漏洞可能导致攻击者利用逻辑缺陷对目标系统进行攻击&#xff0c;造成敏感信息泄露和远程代码执行的风险。 二、相关发声情况 Smartbi是…

电路设计(7)——窗口比较器的multism仿真

1.功能设计 构建一个窗口比较器的电路&#xff0c;在输入电压大于3.5v&#xff0c;小于0.8v时&#xff0c;蜂鸣器报警&#xff0c;输入电压在0.8v到3.5v之间时&#xff0c;不报警。 整体电路如下&#xff1a; 2.设计思路 在输入端&#xff0c;采取电阻分压的方式&#xff0c;输…

【C++】开源:libmodbus通信协议库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍libmodbus通信协议库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

电脑开机快捷启动,启动菜单没有u盘怎么办

电脑开机快捷启动键找不到u盘怎么办 对于快捷启动键找不到u盘的问题&#xff0c;小编很了解其中的门道&#xff0c;因为开机找不到u盘是我们使用电脑时候的常见问题。那么我们到底要如何解决开机找不到u盘的问题呢?其实方法还是蛮简单的&#xff0c;下面小编就来教大家电脑开…

java数据结构与算法刷题-----LeetCode633. 平方数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 思路一&#xff1a;双指针 可以使用双指针&#xff0c;不断从两个方向匹配…

IP代理科普| 共享IP还是独享IP?两者的区别与优势

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

ComfyUI激活中文

comfyui中文地址如下&#xff1a; https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装&#xff1f; 1. git安装 进入项目目录下的custom_nodes目录下&#xff0c;然后进入控制台&#xff0c;运…

『CVE』简析CVE-2023-48795:SSH协议前缀截断攻击(Terrapin攻击)

文章目录 OpenSSH 9.6更新公告Terrapin攻击 (CVE-2023-48795)基本信息利用手段利用路径利用条件利用原理及示意图危害Terrapin-Scanner 基于Terrapin的潜在风险&#xff1a;CVE-2023-46445 & 46446参考完 OpenSSH 9.6更新公告 *ssh(1), sshd(8): implement protocol extens…

算法问题:最优二叉搜索树

给定一个序列 有n个有序且各不相同的键&#xff0c; 集合表示在K中成功的搜索的概率; 为n1 个不同的哑键&#xff0c;表示所有在和之间的值&#xff0c; 表示不成功的搜索的概率. 创建二叉搜索树&#xff0c; 使得其期望搜索花费最小。 一个例子 最优子结构 如果一棵最优二叉搜…

udp多播/组播那些事

多播与组播 多播&#xff08;multicast&#xff09;和组播&#xff08;groupcast&#xff09;是相同的概念&#xff0c;用于描述在网络中一对多的通信方式。在网络通信中&#xff0c;单播&#xff08;unicast&#xff09;是一对一的通信方式&#xff0c;广播&#xff08;broad…

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架&#xff0c;这些日志框架来源于不同的开源组织&#xff0c;给用户暴露的接口也有很多不同…

边缘计算AI智能盒子的视频源必须是固定点监控摄像头吗?

边缘计算AI盒子的视频输入源&#xff0c;要求是RTSP或者GB28181&#xff0c;可以是固定点监控摄像头&#xff08;枪机、球机等&#xff09;&#xff0c;也可以是移动摄像头&#xff0c;例如执法记录仪、智能安全帽、布控球等&#xff0c;但由于RTSP输入要求摄像头有固定IP&…

使用 Postman 进行并发请求:实用教程与最佳实践

背景介绍 最近&#xff0c;我们发起了一个在线图书管理系统的项目。我负责的一个关键模块包括三个主要后台接口&#xff1a; 实现对books数据的检索。实施对likes数据的获取。通过collections端点访问数据。 应对高流量的挑战 在设计并部署接口时&#xff0c;我们不可避免地…

西南科技大学计算机网络实验二 (IP协议分析与以太网协议分析)

一、实验目的 通过分析由跟踪执行traceroute程序发送和接收捕获得到的IP 数据报,深入研究在IP 数据报中的各种字段,理解IP协议。基于ARP命令和Ethereal进行以太网帧捕获与分析,理解和熟悉ARP协议原理以及以太网帧格式。 二、实验环境 与因特网连接的计算机网络系统;主机操…

编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来

一、前置说明 我们把学习 Appium 的第一个脚本称为 appium_helloworld&#xff0c;它用于展示 Appium 的基本用法&#xff0c;验证配置和环境是否正确。 Appium 自动化操作 APP 的基本流程&#xff08;Android平台&#xff09;&#xff1a; 启动 Appium Serveradb 连接设备&…