【技术累积】【点】【java】【27】@JSONField

@JSONField
该注解隶属于阿里fastjson,方便fastjson处理对象时的一些操作
源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
/**
* config encode/decode ordinal
* @since 1.1.42
* @return
*/
int ordinal() default 0;
String name() default "";
String format() default "";
boolean serialize() default true;
boolean deserialize() default true;
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
String label() default "";
/**
* @since 1.2.12
*/
boolean jsonDirect() default false;
/**
* Serializer class to use for serializing associated value.
*
* @since 1.2.16
*/
Class<?> serializeUsing() default Void.class;
/**
* Deserializer class to use for deserializing associated value.
*
* @since 1.2.16
*/
Class<?> deserializeUsing() default Void.class;
/**
* @since 1.2.21
* @return the alternative names of the field when it is deserialized
*/
String[] alternateNames() default {};
/**
* @since 1.2.31
*/
boolean unwrapped() default false;
}
- ordinal() 顺序设置。
缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本
- name() 指定名字。指定后,序列化后字段名变为指定名称,反序列化同理;
- format() 指定日期格式;
- serialize() deserialize() 是否序列化和反序列化,默认true。
- serialzeFeatures() 序列化特性选择,具体参考后面文章吧;通过枚举选择
- parseFeatures() 解释特性选择;通过枚举选择
- label() 打标记,可定制化输出
@JSONField(label = "normal")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@JSONField(label = "normal")
public String getName() {
return name;
}
System.out.println(JSON.toJSONString(v, Labels.includes("normal")));
- jsonDirect() 直接输出而不经过json转译
在fastjson-1.2.12版本中,JSONField支持一个新的配置项jsonDirect,它的用途是:当你有一个字段是字符串类型,里面是json格式数据,你希望直接输入,而不是经过转义之后再输出。
- serializeUsing() deserializeUsing() 指定序列化、反序列化使用自定义Serialize、Parser(注意,直接写在类中即可,格式固定,关键是取值)
//示例1
public static class TimeStampDeserializer implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String time = parser.getLexer().stringVal();
if (StringUtils.isBlank(time)) {
return (T)String.valueOf(new Date().getTime());
} else {
return (T)(time + "000");
}
}
@Override
public int getFastMatchToken() {
return 0;
}
}
//示例2
public static class Model {
@JSONField(serializeUsing = ModelValueSerializer.class)
public int value;
}
public static class ModelValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
Integer value = (Integer) object;
String text = value + "元";
serializer.write(text);
}
}
- alternateNames() 多名字。允许多个名字的变量转成一个
@JSONField(alternateNames = {"user", "person"})
public String name;
- unwrapped() 不封箱
搭配JSON.parseObject
给输出结构体中field配置上@JSONField(name="aaa")等,直接转出得到的json串
Response response = JSON.parseObject(res, Response.class);
@Setter
@Getter
@NoArgsConstructor
@ToString
public class Response {
@JSONField(name = "answerList")
private List<Answer> answers;
@JSONField(name = "timeStamp")
private String timeStamp;
@JSONField(name = "type")
private String answerType;
@JSONField(name = "id")
private String erp;
@JSONField(name = "session")
private String sessionId;
@JSONField(name = "topic")
private String topic;
@JSONField(deserialize = false, serialize = false)
private String answerType = AnswerTypeEnum.ANSWER.getCode();
}
参考文章
- Fastjson JSONField
- JSONField_jsonDirect_cn
- FastJson 自定义Serialize、Parser
- fastjson使用(八) -- LabelFilter的使用
- fastjson的@JSONField注解的一点问题
- fastjson SerializerFeature详解
【技术累积】【点】【java】【27】@JSONField的更多相关文章
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
- Error: java.lang.NullPointerException at outputformat.MysqlOutputFormat.getRecordWriter(MysqlOutputFormat.java:27)
Error: java.lang.NullPointerException at outputformat.MysqlOutputFormat.getRecordWriter(MysqlOutputF ...
- Atitit. 。Jna技术与 解决 java.lang.Error: Invalid memory access
Atitit. .Jna技术与 解决 java.lang.Error: Invalid memory access 1. 原因与解决1 2. jNA (这个ms sun 的)1 3. Code1 4. ...
- 公共技术点之 Java 反射 Reflection
本文摘录地址: http://codekk.com/open-source-project-analysis/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E ...
- 【技术累积】【线】【java】【2】AOP
思维导图 基础概念 翻译:面向切面编程,或面向方面编程: 是OOP的重要补充: 切面:传统的OOP构建的是对象之间的关系,是一种垂直的关系:假设,OOP程序是一个圆筒,那么与业务或逻辑无关的东西,比如 ...
- 【技术累积】【点】【java】【21】序列化二三事
基础概念 把对象等转为二进制进行传输的是序列化,反之为反序列化: 应用场景一般为读写文件,传输数据/接口调用: Externalizable和Serializable java的序列化方式有两种: S ...
- 【技术累积】【点】【java】【30】代理模式
基础 代理模式是Java常见的设计模式之一.所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 什么是代理 参考现实生活中的代理 比如某个品牌的某个省的代理商,作 ...
- 【技术累积】【点】【java】【29】MapUtils
内容 是Apache组织下的commons-collections包中的工具类 <dependency> <groupId>commons-collections</gr ...
随机推荐
- c++面试问题的几个方向
1 关于多态,面向对象的几个要点作为面向对象的程序员,这个问题是必须要弄清楚的,网上.教科书上都是标准答案,关键是理解内涵哦. 2 关于虚函数表和RTTI 这个Inside C++ Object Mo ...
- python 除法总返回浮点
python 除法总返回浮点,要返回整型需要用//: print(type(4/2),type(4//2)) #<class 'float'> <class 'int'>
- [JavaEE] Bootstrapping a JavaEE Application
To bootsrap the application use the following Maven archetype: mvn -DarchetypeGroupId=org.codehaus.m ...
- VM Workstation中如何实现Linux系统的通信
1 确保虚拟机中的Linux是NAT联网方式 2确保Vmware Network Adapter VMnet1和 VMnet8 都是"已启用"状态,如果是"未识别的网 ...
- [LeetCode] 035. Search Insert Position (Medium) (C++)
索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 035. Sea ...
- 通达OA 小飞鱼老师OA工作流设计课程教学网络公开课之HTML基础(一)
通达OA网络教学公开课開始了.有须要的小伙伴们抓住机会奥. 8月29号晚8点不见不散.本次课程的主要内容是通达OA工作流设计课程中须要用到的Html部分学习. 帮忙转发的朋友加送一节VIP课程.
- research plan1111
Hello prof.Choi 感谢您的来电,与您的这次通话我已经期盼了很久.我来做个自我介绍,我叫陈飞,今年27岁了,是河北地质大学计算机科学专业的本科毕业生.我非常想提高自己的学历,现在经过刘老师 ...
- 硬盘-RAID 5组建
没发正文之前本人先声明一下----本文是转载 这篇文章简直是太精彩了,呵呵 ,实在是忍不住了,一定要贴出来,让大家分享! 原作者:唐华 责任编辑:xiexiaojin 我们生活在一个历史记录在硬盘上的 ...
- AngularJS2.0 hello world例子——引入这么多额外的依赖库真是很忧伤啊
初识Angular2 写一个Angular2的Hello World应用相当简单,分三步走: 1. 引入Angular2预定义类型 import {Component,View,bootstrap} ...
- 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
最近在新项目中突然出现了 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...