利用 Java 6 直接处理 JSON

jopen 12年前
     <p>一般在 Java 中处理 JSON 数据,我们会用到各种 json 的第三方 jar 包</p>    <p>详情请看:<a href="http://www.open-open.com/lib/list/16" rel="nofollow" target="_blank">JSON 开发包</a></p>    <p>如果不需要这些 jar 包的话,Java 本身能否处理 JSON 呢?</p>    <p>答案当然是可以,Java 6 提供了 javax.script 包让 Java 有了支持其他脚本语言的特性,例如 JavaScript。而 JavaScript 对 JSON 的支持是天生具备的。</p>    <p>下面步骤讲述如何在 Java 中直接处理 JSON 数据:</p>    <p>首先我们编写一个 json2java.js 文件,代码如下:</p>    <pre class="brush:js; toolbar: true; auto-links: false;">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); };</pre>    <p>这里面提供了一些 toJava 的函数,用于将 JSON 的对象转成对应的 Java 类型。</p>    <p>接下来我们需要初始化脚本引擎 (Tools.java 片段):</p>    <pre class="brush:java; toolbar: true; auto-links: false;">String init = read(Tools.class.getResource("json2java.js")); ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval(init); jsonParser = engine;</pre>    <p>然后可通过下面代码进行 JSON 转换:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">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();</pre>    <p>这就是一个最轻量级的 JSON 转 Java 对象的解决方案:)</p>    <p>下面地址可以查看完整代码:</p>    <p><a href="/misc/goto?guid=4959499937382255131" rel="nofollow" target="_blank">https://gist.github.com/1521692</a></p>