注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

被Sun和Mozilla联合忽悠了一把——第一回、JSON的读取  

2008-12-22 14:35:27|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
虽然目前我们项目使用的是Java,但我对嵌入脚本的爱是挡不住的。我惊喜的发现原来Java 5以后就有一个javax.script包,可以嵌入脚本,而且默认就支持JavaScript。JavaScript是我第二热爱的脚本语言,仅次于Lua,所以我觉得很爽。
有了脚本就是爽,不但可以解析JSON,还可以执行代码,可以在配置文件里面加入函数,可以写公式了。

第一次被郁闷到,是因为JSON,Java提供了一个ScriptEngine.eval()方法,可以执行脚本。不过这个eval返回的是个Object,具体是啥类型,我不知道。我是希望JavaScript那边返回一个JSON对象当配置文件的,可是它丢给我一个java.lang.Object,我根本不知道怎么读里面的配置信息。找了半天也没找到类似Lua API中的lua_setfield之类的东西。不过我不是这么容易屈服的,我写下了一些邪恶的代码,可以读出JSON:

ObjectOperators.java
public interface ObjectOperators {
public Object get(Object o, Object key);
public void put(Object o, Object key, Object value);
public void remove(Object o, Object key);
}
ECMAScriptHelper.java
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public final class ECMAScriptHelper {
static final public ObjectOperators getObjectOperators(ScriptEngine ecmaScriptEnging) throws ScriptException {
return ((Invocable)ecmaScriptEnging).getInterface(ecmaScriptEnging.eval(
"({" +
" 'get':function(o, key) {" +
" return o[key]" +
" }," +
" 'put':function(o, key, value) {" +
" o[key] = value;" +
" }," +
" 'remove':function(o, key) {" +
" delete o[key];" +
" }" +
"})"
), ObjectOperators.class);
}
}
使用示例
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("ECMAScript");
ObjectOperators objectOperators = ECMAScriptHelper.getObjectOperators(scriptEngine);
Object json = scriptEngine.eval("({a:1, b:3, c:['xxx', 'yy']})");
System.out.print(objectOperators.get(json, "a")); // 嘿嘿,能print出a的值,1
Object jsonArray = objectOperators.get(json, "c");
String xxx = (String)objectOperators.get(jsonArray, 0);
System.out.print(xxx);
顺便说一下,用JavaScript虚拟机执行代码时,若要eval出一个JSON对象,需要在JSON外面加上圆括号,这样才会被认为是一个值。
  评论这张
 
阅读(624)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018