FASTJSON转换JAVA对象规则研究分析

本文通过一个示例类说明了在Java中使用FastJSON将对象转换为JSON字符串时的具体规则。重点介绍了哪些成员变量和方法会被转换,以及转换过程中的关键细节。

在JAVA对象转换JSON字符串时,FASTJSON是如何工作的,那些成员变量和方法会被转换成JSON字符串

1,先看代码

public class JsonTEST {
	public String a="公共变量";
	private String b="私有变量(无GET)";
	private String c="私有变量(有公共GET)";
	public String getC() {
		return this.c;
	}
	public String getD() {
		return "公共方法(get命名)(无对应公共变量)";
	}
	private String getE() {
		return "私有方法(get命名)(无对应公共变量)";
	}
	public String fF() {
		return "公共方法(普通命名)";
	}
	private String gG() {
		return "私有方法(普通命名)";
	}
	public String h="公共变量";
	public String getH() {
		return "公共方法(get命名)(有对应公共变量)";
	}
	public String getx() {
		return "公共方法(get命名全小写)(无对应公共变量)";
	}
	public String getxX() {
		return "公共方法(get命名第二个字母大写)(无对应公共变量)";
	}
	public String getxxXxxx() {
		return "公共方法(get命名第三个字母大写)(无对应公共变量)";
	}
	public static void main(String[] args) {
		System.out.println(JSON.toJSONString(new JsonTEST()));
	}
}

2,输出

{"a":"公共变量","c":"私有变量(有公共GET)","d":"公共方法(get命名)(无对应公共变量)","h":"公共方法(get命名)(有对应公共变量)","xX":"公共方法(get命名第二个字母大写)(无对应公共变量)"}

3,结论:

1,公共变量一定转换,key就是公共变量的名字

2,公共方法只有带返回值并且get开头并且get后面2位字符里有大写字母的会被转换,key为第一个字母小写

3,如果同时满足1,2且最后的key是一样的,优先使用方法的值

4,其它情况一律不会转换(也许有遗漏的,请大家指正)

Fastjson支持自定义转换规则,可以通过实现自定义的序列化器(Serializer)和反序列化器(Deserializer)来实现。下面是一个简单的示例,演示如何自定义一个日期格式的序列化和反序列化规则: 首先,定义一个日期格式化的序列化器: ```java public class DateSerializer implements Serializer<Date> { @Override public void write(JSONSerializer serializer, Date date, Object fieldName, Type fieldType, int features) throws IOException { if (date == null) { serializer.writeNull(); return; } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); serializer.write(format.format(date)); } } ``` 然后,定义一个日期格式化的反序列化器: ```java public class DateDeserializer implements ObjectDeserializer { @Override public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { String dateStr = parser.parseObject(String.class); if (StringUtils.isEmpty(dateStr)) { return null; } try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return (T) format.parse(dateStr); } catch (ParseException e) { throw new JSONException("parse date error", e); } } @Override public int getFastMatchToken() { return JSONToken.LITERAL_STRING; } } ``` 最后,使用自定义的序列化器和反序列化器: ```java SerializeConfig.getGlobalInstance().put(Date.class, new DateSerializer()); ParserConfig.getGlobalInstance().putDeserializer(Date.class, new DateDeserializer()); ``` 这样,当Fastjson序列化或反序列化包含日期类型的对象时,就会使用我们自定义的日期格式化规则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值