• 利用 Java 6 javax.script 包直接处理 JSON
    时间:2011-12-27?? 作者:佚名?? 出处:互联网

    以往我们在Java中处理 JSON 数据时,经常会引用到各种 json 的第三方 jar 包。有时很简单的功能,而引用比较臃肿的包,是比较难以容忍的。很高兴我们可以使用Java 6 提供的 javax.script 包来处理。 Java 有了支持其他脚本语言的特性,例如 JavaScript。而 JavaScript 对 JSON 的支持是天生具备的。让我们来看一些实例。
    JSON转为java类:
    public class JSON2Java {
    ??
    ???private static final ScriptEngine jsonParser;
    ???
    ???static
    ???{
    ??????try
    ??????{
    ?????????String init = read(Tools.class.getResource("json2java.js"));
    ?????????ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    ?????????engine.eval(init);
    ?????????jsonParser = engine;
    ??????}
    ??????catch (Exception e)
    ??????{
    ?????????// Unexpected
    ?????????throw new AssertionError(e);
    ??????}
    ???}
    ???public static Object parseJSON(String json)
    ???{
    ??????try
    ??????{
    ?????????Bindings bindings = new SimpleBindings();
    ?????????String eval = "var tmp = (" + json + ");var o = new java.util.concurrent.atomic.AtomicReference(tmp.toJava());";
    ?????????jsonParser.eval(eval, bindings);
    ?????????AtomicReference ret = (AtomicReference)bindings.get("o");
    ?????????return ret.get();
    ??????}
    ??????catch (ScriptException e)
    ??????{
    ?????????throw new RuntimeException("Invalid json", e);
    ??????}
    ???}
    }

    我们编写一个 json2java.js 文件,这里面提供了一些 toJava 的函数,用于将 JSON 的对象转成对应的 Java 类型。
    Object.prototype.toJava = function() {
    ??var m = new java.util.HashMap();
    ??for (var key in this)
    ????if (this.hasOwnProperty(key))
    ??????m.put(key, this[key].toJava());
    ??return m;
    };
    Array.prototype.toJava = function() {
    ??var l = this.length;
    ??var a = new java.lang.reflect.Array.newInstance(java.lang.Object, l);
    ??for (var i = 0;i < l;i++)
    ????a[i] = this[i];
    ??return a;
    };
    String.prototype.toJava = function() {
    ??return new java.lang.String(this);
    };
    Boolean.prototype.toJava = function() {
    ??return java.lang.Boolean.valueOf(this);
    };
    Number.prototype.toJava = function() {
    ??return java.lang.Integer(this);
    };

    解析操作:
    Bindings bindings = new SimpleBindings();
    String eval = "var tmp = (" + json + ");var o = new AtomicReference(tmp.toJava());";
    jsonParser.eval(eval, bindings);
    AtomicReference ret = (AtomicReference)bindings.get("o");
    return ret.get();

    初始化安装:
    String init = read(Tools.class.getResource("json2java.js"));
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    engine.eval(init);
    jsonParser = engine;
    具体参看:https://gist.github.com/1521692

    网友留言/评论

    我要留言/评论