前言
现有一个需求,封装一个方法,将Object转换成任意对象
如下,本文采用JSON字符串作为例子:
{
"result": [
{
"waypointIndex": 0,
"imageId": "xxxx.jpg"
}
],
"isSuccess": true
}
通过JSONPath 利用OQL语法 可解析深层对象
传统方式
public static String jsonData = "{\"isSuccess\": true,\"result\": [{\"imageId\": \"xxxx.jpg\",\"waypointIndex\": 0}]}";
public Object getObj(String key){
JSONObject jsonObject = JSONObject.parseObject(jsonData);
return JSONPath.eval(jsonObject, key);
}
@Test
public void test() {
boolean isSuccess = (Boolean)getObj("$.isSuccess");
JSONObject jsonObject = (JSONObject)getObj("$");
List<JSONObject> list = (List<JSONObject>)getObj("result");
System.out.println(isSuccess);
System.out.println(jsonObject);
System.out.println(list);
}
打印输出
true
{"result":[{"waypointIndex":0,"imageId":"xxxx.jpg"}],"isSuccess":true}
[{"waypointIndex":0,"imageId":"xxxx.jpg"}]
通过Java动态泛型
这种方式节省了代码,想要即所得,在封装轮子中使用较多。并且得到得结果也是一样的。
public <T> T getGenericObj(String key){
JSONObject jsonObject = JSONObject.parseObject(jsonData);
return (T)JSONPath.eval(jsonObject, key);
}
/**
* 通过Java动态泛型
*/
@Test
public void testGeneric() {
boolean isSuccess = getGenericObj("$.isSuccess");
JSONObject jsonObject = getGenericObj("$");
List<JSONObject> list = getGenericObj("result");
System.out.println(isSuccess);
System.out.println(jsonObject);
System.out.println(list);
// 写错类型
String success = getGenericObj("$.isSuccess");
}
打印输出
true
{"result":[{"waypointIndex":0,"imageId":"xxxx.jpg"}],"isSuccess":true}
[{"waypointIndex":0,"imageId":"xxxx.jpg"}]
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
写错类型的影响,会报 强制转换异常(java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String)
当然这种常见下,你不确定是什么类型,可以使用Object,如果你提前知道是什么类型,用这种方式还是挺方便的
717

被折叠的 条评论
为什么被折叠?



