原生JAVA解析json
大概思路:
1.扫描出字符串
2.按顺序解析字符串
容易迷糊的地方
1.引用传递
2.解析逻辑
优点
1.能识别非标准json
2.一个类搞定
3.一次循环
缺点
1.非法string的值类型没做识别,懒得写了
package com.ics.sdk;import java.math.BigInteger;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;public class Json{private Json parent;private RegEx isInteger=new RegEx("^\\d+$");private RegEx isDouble=new RegEx("^\\d*\\.\\d+$");private RegEx isBoolean=new RegEx("^(true|false)$");private boolean isArray=false;private HashMap<String,Object> data=new HashMap<>();private List<Object> array=new ArrayList<>();public Json(){ChangeToItem();}public Json(ResultSet resultSet) throws Issue{ChangeToArray();try{ResultSetMetaData metaData=resultSet.getMetaData();int keysLength=metaData.getColumnCount();String[] keys=new String[keysLength];for(int i=0;i<keysLength;i++){keys[i]=metaData.getColumnLabel(i+1);}while(resultSet.next()){Json item=new Json();for(int i=0;i<keysLength;i++){item.ItemSet(keys[i],resultSet.getString(keys[i]));}ArrayInsert(item);}}catch(SQLException e){//e.printStackTrace();throw new Issue("Json Init Issue",e);}}public Json(String content) throws Issue{int i=0;int l=content.length();StringBuffer v=new StringBuffer();boolean wordIsKey=false;Object wordTmp=null;int readType=0;//识别当前值存在位置 0等待 1数组value 2数组end 3key 4key end 5value 6value endchar side=0;//当前值加载情况 0等待 1无引号 +引号Json p=this;Json j;String key=null;boolean isError=false;boolean isEnd=false;//扫描为字符串while(i<l){char w=content.charAt(i++);switch(w){case '[':case ']':case '{':case '}':case ':':case ',':if(side==0){wordTmp=w;wordIsKey=true;}else if(side==1){wordTmp=v.toString();v=new StringBuffer();wordIsKey=false;side=0;i--;}else{v.append(w);}break;case '\'':case '"':if(side==0){side=w;}else if(side==1){wordTmp=v.toString();v=new StringBuffer();wordIsKey=false;side=w;}else{if(side==w&&content.charAt(i-2)!='\\'){wordTmp=v.toString();v=new StringBuffer();wordIsKey=false;side=0;}else{v.append(w);}}break;case ' ':if(side==1){wordTmp=v.toString();v=new StringBuffer();wordIsKey=false;side=0;}if(side>1){v.append(w);}break;default:if(side==0){side=1;}v.append(w);}if(wordTmp!=null){//解析字符串String word=wordTmp.toString();wordTmp=null;//Log.Info(word+"\n");switch(readType){case 0:if(wordIsKey){if(word.equals("[")){ChangeToArray();readType=1;}else if(word.equals("{")){ChangeToItem();readType=3;}else{isError=true;}}else{isError=true;}break;case 1:if(wordIsKey){if(word.equals("[")){j=new Json();j.ChangeToArray();j.parent=p;p.ArrayInsert(j);p=j;readType=1;}else if(word.equals("{")){j=new Json();j.parent=p;p.ArrayInsert(j);p=j;readType=3;}else{isError=true;}}else{SetValue(p,word);readType=2;}break;case 2:if(wordIsKey){if(word.equals(",")){readType=1;}else if(word.equals("]")){p=p.parent;if(p==null){isEnd=true;}else if(p.isArray){readType=2;}else{readType=6;}}}else{isError=true;}break;case 3:if(wordIsKey){isError=true;}else{key=word;readType=4;}break;case 4:if(wordIsKey&&word.equals(":")){readType=5;}else{isError=true;}break;case 5:if(wordIsKey){if(word.equals("[")){j=new Json();j.ChangeToArray();j.parent=p;p.ItemSet(key,j);p=j;readType=1;}else if(word.equals("{")){j=new Json();j.parent=p;p.ItemSet(key,j);p=j;readType=3;}else{isError=true;}}else{SetValue(p,key,word);key=null;readType=6;}break;case 6:if(wordIsKey){if(word.equals(",")){readType=3;}else if(word.equals("}")){p=p.parent;if(p==null){isEnd=true;}else if(p.isArray){readType=2;}else{readType=6;}}else{isError=true;}}else{isError=true;}break;}if(isEnd&&i<l||isError){throw new Issue("index["+i+"]word["+word+"]\n"+content);}//Log.Info(word+"\n");//Log.Info(isError+"\n");}}//Log.Info(this);}public static void main(String[] args){try{//new Json(" {a:1,b:'2\\'3',c:{d:5,f:'{}[]:,\\'\"'}}");//new Json(" [1,2,[4,5,6],[7,[8,[[9],10]]],[[[[11]]]]]");//new Json(" [{a:1},9,{c:3}]");new Json(" {a:1,b:[2,3],c:4]");//this is error//new Json(" [{a:1},2,{c:3},'d',{f:[5,6],h:{i:7,j:[{g:8}]}}]");}catch(Issue e){Log.Info(e);}}private Object GetValue(String value){if(isInteger.Test(value)){return new BigInteger(value);}else if(isDouble.Test(value)){return Double.parseDouble(value);}else if(isBoolean.Test(value)){return Boolean.parseBoolean(value);}else{return value;}}private void SetValue(Json json,String key,String value){json.ItemSet(key,GetValue(value));}private void SetValue(Json json,String value){json.ArrayInsert(GetValue(value));}public void ChangeToItem(){isArray=false;}public void ChangeToArray(){isArray=true;}/*******************item*******************/public boolean ItemExist(String key){return data.containsKey(key);}public void ItemSet(String key,Object value){data.put(key,value);}public Object ItemGet(String key){return data.get(key);}public void ItemDelete(String key){if(!isArray){data.remove(key);}}public String[] ItemKeys(){Set<String> keySet=data.keySet();String[] keys=new String[keySet.size()];keySet.toArray(keys);return keys;}/*******************array*******************/public int ArrayLength(){return array.size();}public int ArrayIndexOf(Object item){return array.indexOf(item);}public boolean ArrayExist(Object item){return ArrayIndexOf(item)>=0;}public Object ArrayGet(int index){return array.get(index);}public Json ArrayGetJson(int index){return (Json)ArrayGet(index);}public void ArrayInsert(Object item){array.add(item);}public void ArrayInsert(Object item,int index){array.add(index,item);}public void ArrayRemove(Object item){array.remove(item);}public void ArrayRemove(int index){array.remove(index);}/*******************table*******************/public Object TableGet(int row,String key){Json json=ArrayGetJson(row);if(json==null){return null;}else{return json.ItemGet(key);}}public String TableGetString(int row,String key){Object value=TableGet(row,key);if(value==null){return null;}else{return value.toString();}}public int TableGetInteger(int row,String key) throws Issue{Object value=TableGet(row,key);try{return Integer.parseInt(value.toString());}catch(Exception e){throw new Issue("row["+row+"]key["+key+"]value["+value+"]",e);}}public double TableGetDouble(int row,String key) throws Issue{Object value=TableGet(row,key);try{return Double.parseDouble(value.toString());}catch(Exception e){throw new Issue("row["+row+"]key["+key+"]value["+value+"]",e);}}public String toString(){String rs="";if(isArray){for(int i=0, l=array.size();i<l;i++){rs+=","+array.get(i);}if(rs.length()>0){rs=rs.substring(1);}return "["+rs+"]";}else{String[] keys=ItemKeys();for(int i=0, l=keys.length;i<l;i++){Object v=ItemGet(keys[i]);if(v instanceof String){v="\""+((String)v).replaceAll("\\\\","\\\\\\\\").replaceAll("\"","\\\\\"")+"\"";}rs+=",\""+keys[i]+"\":"+v;}if(rs.length()>0){rs=rs.substring(1);}return "{"+rs+"}";}}
}
原生JAVA解析json相关推荐
- java解析json数组
java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; p ...
- java解析json的一种方法
package com.hanchao.web; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /************* ...
- 如何使用java解析json文件并将其写入数据库
JAVA解析JSON数据文件 在使用第三方的api文档时,会得到相应的JSON数据文件,那么我们怎样将JSON文件写入数据库从而测试数据呢?下面我将给大家做一个简单的展示. 一.什么是JSON JSO ...
- Java解析JSON格式数据
Java解析JSON格式的数据主要用到两个类JSONObject和JSONArray,这两个类在json-lib-2.4-jdk15包中,在使用JSONObject时除了需要这个包外还需要相关的依赖包 ...
- Java解析JSON出现双引号变成转义字符quot;解决办法
Java解析JSON出现双引号变成转义字符" 问题描述: 在接口中读取传过来的json数据,但是双引号都转义成了" 读取xml文件格式如下: {"message" ...
- Java解析JSON数据
Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...
- Java解析json字符串和json数组
Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){Map& ...
- java解析json数据_java解析JSON数据详解
JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...
- 除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?
昨天下午 5 点 10 分左右,我解决掉了最后一个 bug,轻舒一口气,准备关机下班.可这个时候,老板朝我走来,脸上挂着神秘的微笑,我就知道他不怀好意.果不其然,他扔给了我一个新的需求,要我在 Jav ...
- JAVA 解析JSON数据
JSON 是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java 语言中解析json数 ...
最新文章
- node.js学习随笔
- github如何make contribute to 其它开源项目
- 彩色图像分割MATLAB代码
- cordova开发中,android端利用百度sdk定位。
- 分割等和子集—leetcode416
- Servlet 登录时数据校验
- 如何在VS2013中进行Boost单元测试
- 模板类出现外部符号无法解析错误
- Python type创建类
- node csrf 防御 待续
- hdu 3501(欧拉函数)
- 韩荣温控器nx2使用说明书_如何查看您的Ecobee温控器的使用历史记录
- js实现分页并请求ajax,js实现ajax分页完整实例
- Qt之QListView的简单使用(含源码+注释)
- 如何申请CSDN博客?
- IT,互联网,科技,技术博客网站推荐
- 智能暖风机——3.利用B3950实现温度采集功能
- PHPstudy 数据库基本操作
- java + Selenium实现12306自动购票
- 推荐一个好的查询快递的网站给大家。
热门文章
- Photoshop如何自定义形状
- 河南高二计算机会考excel,(完整版)高中信息技术学业水平考试Word、Excel操作题考点总结...
- 基于51单片机的多功能温度监测系统(附代码)
- 闪迪u盘不能识别好办法_闪迪u盘修复工具,小编教你怎么修复闪迪U盘
- Scrapy实例__链家租房爬虫
- 读书笔记-人月神话10
- 《一》微信小程序简介
- 苹果手机中病毒显示无服务器,苹果手机浏览器提示中毒,如图?
- 苹果手机自带表格软件_苹果手机还自带扫描仪,没想到今天才发现
- 不清楚Word如何批量转PDF?快来跟我学这两个妙招