最近使用了json用于传输数据,Java没有自带的json解析工具,所以需要借助第三方工具。我使用的是org.json。在使用了一段时间后,我从网上找了一些例子,其实要自己写一个简单的工具解析json并不难,于是就尝试自己写一个JSON工具。现在只写好了json与非JavaBean间的转换,下篇再介绍JavaBean的转换,代码编写的不太好,高人有建议请指点呵。勿喷。
这个工具包含以下部分
JSONUtil类:最重要的类,也是直接使用的工具。提供几个方法,实现json字符串与Java内置对象,以及JavaBean间的相互转化
JSONException类:JSON异常类,集成Exception,作用并不大,只是为了强调专用性,以及日后更新方便。
除了工具外还需要两个bean类
Person类:人。含有ID,name,name、phonelist(拥有的手机)和相应getter、setter
Phone类:手机。含有brand,price
全部的功能都由JSONUtil完成,为了更清晰地展示JSONUtil。生成该类的javadoc。
单个类文件javadoc生成步骤:1、在左边项目结构中右击选择export 2、选择javadoc类型 3、导出到一个文件夹即可。JSONUtIL到处如下
前面说过工具尚未写好,所以这篇只介绍三个方法。
一、jsonToObject
将json字符串转换为Map对象。
<span style="white-space:pre"> </span>/**
* 将json字符串转换为java对象(非List)
* @param json字符串,非数组形式,否则报错。
*/
public static Map<String, Object> jsonToObject(String js){<span style="white-space:pre"> </span>
Map<String, Object> reMap =new HashMap<String, Object>();
//刨去首尾括号
js=js.substring(1,js.length()-1);
int lindex=0,rindex=1;
String keystring;
while(true){
//匹配键
while(js.charAt(rindex)!='\"'||js.charAt(rindex+1)!=':')
rindex++;
keystring=js.substring(lindex+1, rindex);
System.out.println(js.charAt(rindex));
lindex=rindex=rindex+2;
//匹配值
Object value="";
if(js.charAt(lindex)=='{'){//fundRightPartIndex用于查找指定左部的对应右部
rindex=findRightPartIndex(js,lindex,rindex,'{');
value=jsonToObject(js.substring(lindex,rindex+1));
}
else if(js.charAt(lindex)=='['){
rindex=findRightPartIndex(js,lindex,rindex,'[');
value=jsonToArray(js.substring(lindex,rindex+1));
}else if(js.charAt(lindex)=='\"'){//此处注意防止匹配下表错误
rindex=findRightPartIndex(js,lindex,rindex,'\"');
value=js.substring(lindex+1, rindex);
}else{
rindex=findRightPartIndex(js,lindex,rindex);
value=js.substring(lindex, rindex+1);//匹配到数值,因为有double、int、float多种,此处还是以字串存入
}
System.out.println("chat right index"+js.substring(lindex+1, rindex));
reMap.put(keystring, value);
//判断是否到达字符串尾部
if(rindex==js.length()-1)
break;
//若未到尾部,此时rindex在逗号前面
lindex=rindex+2;
rindex+=3;
}
return reMap;
}
</pre><pre name="code" class="java"><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>*findRightPartIndex是一个私有方法,用于寻找一个串中指定左部的对应右部,参数分别为字符串、开始左下标、开始右下标、查找字符<span style="white-space:pre"> </span>下面这个方法</span><span style="font-family: Arial, Helvetica, sans-serif;">将查找js字符串从下标5开始,匹配{的右部即},右下标向右移动,直到找到匹配下标返回或到达串尾</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">
</span><span style="white-space:pre"> </span>*/<span style="white-space:pre"> </span>findRightPartIndex(js,4,5,'{')</span>
二、jsonToArray
将json字符串转换为List。
<span style="white-space:pre"> </span>/**
* 将json字符串转换为数组,格式必须正确
*/
public static Collection jsonToArray(String js){
List list=new ArrayList();
js=js.substring(1,js.length()-1);
int rightIndex=0;
int i=0;
while(i<js.length()){
//匹配一个值
if(js.charAt(i)=='{'){
int leftPartCount=1;
rightIndex=i;
Map.Entry<String, Object> entry;
//匹配键
while(leftPartCount!=0){
rightIndex++;
if(js.charAt(rightIndex)=='{') leftPartCount++;
if(js.charAt(rightIndex)=='}') leftPartCount--;
}
Map m=JSONUtil.jsonToObject(js.substring(i,rightIndex));
list.add(m);
i=rightIndex;
if(rightIndex==js.length()-1) break;
}
i++;
}
return list;
}
三、objectToJson
将Java对象(包括Map和List。不包含基础
/**
* JAVA对象(只能为map、list) to json string
* @param obj list or map
* @author xcj
* date:2014-11-19
*/
public static String toJSONstring(Object obj) throws Exception{
/*
* 判断数组为map or list
*/
if(obj instanceof Collection==false&&obj instanceof Map==false)
throw new JsonException("ERROR:CAN NOT Stringfy a null Object TO JSON STRING");
StringBuilder sb=new StringBuilder();
if(obj instanceof List){
List list=(List)obj;
sb.append("[");
Iterator iterator=list.iterator();
while(iterator.hasNext()){
sb.append(toJSONstring(iterator.next()));
sb.append(",");
}
sb.setLength(sb.length()-1);
sb.append("]");
}
else if(obj instanceof Map){
Map<String,Object> m=(Map)obj;
sb.append("{");
for(Map.Entry<String,Object> entry:m.entrySet()){
sb.append("\""+entry.getKey()+"\":");
sb.append(toJSONstring(entry.getValue()));
sb.append(",");
}
sb.setLength(sb.length()-1);
sb.append("}");
}
return sb.toString();
}
以上就是JSONUtil类的功能,经测试可以成功在map、list和json间相互转化,除了jdk没有依赖其他包。但是限于水平,代码的编写比较烂,能看的顺就行。这两天把JavaBean的转换写一写,再摆上来。