@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();
}

参考文章

最新文章

  1. English sentence
  2. JavaWeb 7 Servlet
  3. java的String类(一)
  4. 图论 BZOJ 3669 [Noi2014]魔法森林
  5. mahout学习-1
  6. Hacker(三)之黑客定位目标---IP
  7. nginx源代码分析--配置文件解析
  8. MySQL- 5.7 sys schema笔记
  9. 【Python3爬虫】用Python发送天气预报邮件
  10. BUTXO详解
  11. .NET面试题01-值类型与引用类型
  12. RabbitMQ 可靠投递
  13. exec函数族的作用与讲解
  14. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
  15. 解决.net+steeltoe服务客户端被服务调用出现400BadRequst错误
  16. Docker运行python容器
  17. Python distribute到底使用package_data还是MANIFEST.in?
  18. jquery mobiscroll 滑动、滚动
  19. Python下json中文乱码解决办法
  20. VC++:ActiveX Test Container

热门文章

  1. SiteMesh基础教程
  2. Android: 关于百度地图缩放级别
  3. Android 高仿 频道管理----网易、今日头条、腾讯视频 (能够拖动的GridView)附源代码DEMO
  4. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式
  5. 【大话QT之十四】QT实现多语言切换
  6. CloudEngine 6800基础配置-01_常见密码操作
  7. 数据库html 数据的分句
  8. Combining an audio file with video file in python
  9. 洛谷 P3398 仓鼠找sugar —— 树链剖分
  10. unsigned 赋值负数输出情况 &amp; printf输出格式