[已解决]nashorn中解决ScriptObjectMirror转换为Java对象

原创
2020/12/26 10:52
阅读数 1.9W

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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部