在工作中碰到了一些问题,具体是这样的,在Swing画的界面上有许多的组件,每个组件上各自对应的有很多值,如下图所示;
这些组件对应的值设置好之后,在重新打开界面后还需要将原来设置好的值重新置入。
由于系统设计的问题,从前台界面传输到后台的时候没办法传对象(接口设计原因),这样这些个作为查询条件的值只能作为字符串传递。。
于是想到了用JSON转换Java对象的方法得到解决;可以将界面上每个组件的变量名,可能的操作符与对应的值作为一个查询对象QueryMeta组装:然后讲组装好的对象转换为JSON输出的string类型保存,然后当将保存的值重新置入界面的时候,再进行还原处理。
JSON定义:引自百度百科
JSON(JavaScript Object Notation) 本来是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
当然了JSON也可以支持java对象。下面是研究JSON的时候做的一些小例子,放到这里做个备份。主要测试JSON对象跟JSON String格式之间的互相转换。用到的包有:json-lib-2.3-jdk15,commons-logging-1.1.1,ezmorph-1.0.6,commons-collections-3.2.1,commons-beanutils-1.8.1,commons-lang-2.5-sources
package zhaozh.test;
/**
*
* @author zhaozh 2010-11-8 下午11:04:43
*
*/
public class QueryMeta {
private String operator;
private String leftKey;
private Object rightValues;
public static final String OP = "operator";
public static final String LEFT = "leftkey";
public static final String RIGHT = "rightValues";
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getLeftKey() {
return leftKey;
}
public void setLeftKey(String leftKey) {
this.leftKey = leftKey;
}
public Object getRightValues() {
return rightValues;
}
public void setRightValues(Object rightValues) {
this.rightValues = rightValues;
}
public String valueof(){
return leftKey + operator + rightValues;
}
}
package zhaozh.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.util.PropertySetStrategy;
import org.apache.commons.collections.map.SingletonMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @author zhaozh 2010-11-9 下午10:32:11
*
*/
public class JsonTest {
private static final Log log = LogFactory.getLog(JsonTest.class);
private static Map
static{
opMap.put("accbook", "=");
opMap.put("vouchertype", "=");
opMap.put("voucherno", "=");
opMap.put("preparedate", "=");
}
/**
* @param args
* 两种转换的方法:JSONObject.toBean,JSONSerializer.toJava
*/
public static void main(String[] args) {
JsonTest jsonTest = new JsonTest();
JSONArray json = jsonTest.createJSON();
json = jsonTest.restorJSON(json.toString());
Iterator it = json.iterator();
while(it.hasNext()){
JSONObject jsonObject = (JSONObject) it.next();
QueryMeta obj = (QueryMeta) JSONObject.toBean(jsonObject,QueryMeta.class);
log.info(obj.valueof());
}
Object obj = JSONSerializer.toJava(json,jsonTest.makeConfig());
if(obj.getClass().isAssignableFrom(ArrayList.class)){
ArrayList
for (QueryMeta queryMeta : querys) {
log.info(queryMeta.valueof());
}
}
}
private JSONArray restorJSON(String json) {
return JSONArray.fromObject(json,makeConfig());
}
private JSONArray createJSON() {
JSONArray json = new JSONArray();
json.addAll(makeQueryByComponent(makeCompMap()),makeConfig());
log.info(json);
return json;
}
private JsonConfig makeConfig() {
JsonConfig config = new JsonConfig();
config.setCollectionType(List.class);
config.setRootClass(QueryMeta.class);
// config.registerJsonBeanProcessor(QueryMeta.class, new QueryMetaProcessor());
config.setPropertySetStrategy(PropertySetStrategy.DEFAULT);
return config;
}
private Map
Map
List
compnames.add("accbook");
compnames.add("vouchertype");
compnames.add("voucherno");
compnames.add("preparedate");
for (String name : compnames) {
SingletonMap map2 = new SingletonMap(opMap.get(name),"a" + name);
map.put(name, map2);
}
return map;
}
/**
*
* @param compMap {compname:{operator:values}}
* @return
*/
private List
Map
List
Set
for (String key : keys) {
QueryMeta meta = new QueryMeta();
meta.setLeftKey(key);
SingletonMap map = compMap.get(key);
meta.setOperator(map.getKey().toString());
meta.setRightValues(map.getValue());
metas.add(meta);
}
return metas;
}
}