之前在使用 alibaba的fastjson
做数组的相关转换操作的时候遇到一些问题,这里把遇到的问题以及如何解决的记录如下。
一. 转换过程中的问题
话不多说,先上代码。
1 | public class JsonTest { |
输出结果是:
1 | Before class:class [[Ljava.lang.String; |
遇到的问题如上,把一个数组转为json字符串后,再使用用JSON.parse()转换回来,获取到的class类型却是JSONArray的。
当然你也可以用很简单的办法把他给转换成需要的String二维数组。不过我的需求是:
- 只知道是个数组,知道到数组的原始Class类型(如果是
String[][]
知道是String.class
) - 不知道是几维数组,也不知道最开始传入的数组的长度
- 在拿到从Json字符串转换回来的object的时候,必须要使用原始类型(比如是
String[][]
,那么转换回来的object,使用object.getClass()
应该得到[[Ljava.lang.String
),否则无法使用。
为了解决上述问题,在网上查阅各种资料无果,最后突然想到查询数组的反射
,找到了java.lang.reflect.Array
这个包,下面对这个包里面的一些使用做一个简单的介绍。
二. 关于java.lang.reflect.Array
同样先上代码:
1 | public class ArrayTest { |
输出结果是:
1 | CLASS:class [Ljava.lang.String;-----LENGTH:10 |
这里已经在上述代码中做了大部分的注释,这里也不在详细介绍,主要说一下几个方法的作用。
Array.newInstance(Class<?> componentType, int length)
和Array.newInstance(Class<?> componentType, int... dimensions)
第一个用于创建传入类型的长度为length的一维数组,第二个可以用于创建传入类型的多维数组,维度和长度由传入的第二个参数决定。Array.get(Object array, int index)
用于获取传入的数组array的index下的内容。Array.set(Object array, int index, Object value)
用于对传入的数组array的index进行赋值,赋值为value,具体使用见上述的代码。
三. 如何解决转换问题
在具备了以上的了解后,再来解决所遇到的问题。
1 | public class JsonArrayToArray { |
输出结果是:
1 | [["1","2","3"],["4","5","6"]] |
可以看到最后被将转换后的Class为JSONArray的结果在转换为最初的数组类型,String[][]
,由最后realArray.getClass().equals(String[][].class)
返回结果true
也可以得到确实转换正确了。具体的解析方法可以看上面的parseJsonArray()方法。