ScriptObjectMirror实现了Bindings,Bindings继承与java.util.Map。
但是如果直接将ScriptObjectMirror对象调用[JSON.toJSONString(o)]转换为json,只有简单的json可行,稍微复杂的就无法正确解析。
如:
简单格式如:
{
"x": "xx",
"y": "yy"
}
稍微复杂点的就无法正确解析,如:
{
"x": "xx",
"y": ["yy","yyy"]
}
像这种带有数组的,直接解析的结果如下:
{
"x": "xx",
"y": [
{"0":"yy"},
{"1","yyy"
]
}
这种显然不是我们想要的解析结果。
解决方案是使用递归,遍历每一层是否是数组,如果是数组,用List来接收。
公共方法如下:
public static Object toObject(ScriptObjectMirror mirror) { if (mirror.isEmpty()) { return null; } if (mirror.isArray()) { List<Object> list = new ArrayList<>(); for (Map.Entry<String, Object> entry : mirror.entrySet()) { Object result = entry.getValue(); if (result instanceof ScriptObjectMirror) { list.add(toObject((ScriptObjectMirror) result)); } else { list.add(result); } } return list; } Map<String, Object> map = new HashMap<>(); for (Map.Entry<String, Object> entry : mirror.entrySet()) { Object result = entry.getValue(); if (result instanceof ScriptObjectMirror) { map.put(entry.getKey(), toObject((ScriptObjectMirror) result)); } else { map.put(entry.getKey(), result); } } return map; }
使用时,将ScriptObjectMirror对象传入,直接返回Object。Object有三种返回类型,null,Map或List