写在前面:时间过得真快,craftgame开发日志已经很久没更新了,因为我也没内容水了。突然发现结合开发的时候我遇到的问题写成专栏会不会好一点?干脆把开发日志变成开发教学吧!
最近忙活了一段时间,弃坑了cgmsc,但是带来了很多的东西,就比如说今天要说的json解析。
解析json
不用库解析json要怎么做呢?首先你要明白几点java本身有一个js引擎,可以用来执行js
json在js里面是原生受到支持的
js引擎是支持返回值的
java的js引擎叫做nashorn,支持传入一个String对象作为js代码被执行的,如果返回的类型是number,则会转换成java的基本数据类型类型,如果的类型是object,则会返回ScriptObjectMirror对象,而ScriptObjectMirror类实现了Map接口,也就是说ScriptObjectMirror对象本身可以当作Map对象来用,这便是其原理
那么要如何达到效果呢?众所周知,js有个东西叫做js函数,可以用类似这样的js代码来实现
function json(v){return v;}
用js引擎执行上面的代码,然后可以尝试用一个字符串描述json,然后执行这个函数,v填那个json。
如果json里面也有js对象,那么ScriptObjectMirror里面也会有ScriptObjectMirror,如果返回的是一个数组,那么键是数字
将对象转化为json
将对象的属性转化成json也不是很难,此操作是为了传输数据的,那么也没有必要把java方法也转化成json,只需要将属性转化成json即可。那么是怎么样的呢?我们知道,json是字符串,那么肯定少不了字符串操作。幸运的是,我们在这里用不到正则表达式。只需要用StringBuilder即可。那么怎么做呢?
我们知道,java还有一个东西叫做反射。用反射我们可以实现动态获取属性的名称和值。这就是我们需要的东西。Object类有一个getClass方法,可以通过一个对象获取Class对象,然后调用getFields()方法,获取到所有的属性。
想必你们应该知道我要干啥了吧,用我之前讲过的Stream api可以方便的对这个数组进行操作。我们需要getName()和get(Object)的方法,然后通过json的格式写进去。如果这个属性的值是一个对象,递归调用即可。