编写自己的json解析工具一

最近使用了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的转换写一写,再摆上来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Python tkinter 程序,可以将输入的 JSON 字符串解析并以可视化方式显示: ```python import json import tkinter as tk from tkinter import filedialog class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widgets() def create_widgets(self): self.json_text = tk.Text(self, height=20, width=50) self.json_text.pack(side="left") self.parse_button = tk.Button(self) self.parse_button["text"] = "Parse JSON" self.parse_button["command"] = self.parse_json self.parse_button.pack(side="left") self.tree = tk.ttk.Treeview(self) self.tree.pack(side="left") self.scrollbar = tk.Scrollbar(self, orient="vertical", command=self.tree.yview) self.scrollbar.pack(side="right", fill="y") self.tree.configure(yscrollcommand=self.scrollbar.set) def parse_json(self): try: json_str = self.json_text.get("1.0", "end-1c") json_obj = json.loads(json_str) self.tree.delete(*self.tree.get_children()) self.process_json_obj(json_obj, "") except Exception as e: tk.messagebox.showerror("Error", str(e)) def process_json_obj(self, json_obj, parent_id): if isinstance(json_obj, dict): for key, value in json_obj.items(): item_id = self.tree.insert(parent_id, "end", text=str(key), open=True) self.process_json_obj(value, item_id) elif isinstance(json_obj, list): for index, value in enumerate(json_obj): item_id = self.tree.insert(parent_id, "end", text=str(index), open=True) self.process_json_obj(value, item_id) else: self.tree.insert(parent_id, "end", text=str(json_obj)) if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop() ``` 此程序包含一个文本框,用于输入 JSON 字符串,一个按钮用于解析 JSON 并将其显示在树状图中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值