大概思路:
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相关推荐

  1. java解析json数组

    java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; p ...

  2. java解析json的一种方法

    package com.hanchao.web; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /************* ...

  3. 如何使用java解析json文件并将其写入数据库

    JAVA解析JSON数据文件 在使用第三方的api文档时,会得到相应的JSON数据文件,那么我们怎样将JSON文件写入数据库从而测试数据呢?下面我将给大家做一个简单的展示. 一.什么是JSON JSO ...

  4. Java解析JSON格式数据

    Java解析JSON格式的数据主要用到两个类JSONObject和JSONArray,这两个类在json-lib-2.4-jdk15包中,在使用JSONObject时除了需要这个包外还需要相关的依赖包 ...

  5. Java解析JSON出现双引号变成转义字符quot;解决办法

    Java解析JSON出现双引号变成转义字符" 问题描述: 在接口中读取传过来的json数据,但是双引号都转义成了" 读取xml文件格式如下: {"message" ...

  6. Java解析JSON数据

    Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...

  7. Java解析json字符串和json数组

    Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){Map& ...

  8. java解析json数据_java解析JSON数据详解

    JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...

  9. 除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?

    昨天下午 5 点 10 分左右,我解决掉了最后一个 bug,轻舒一口气,准备关机下班.可这个时候,老板朝我走来,脸上挂着神秘的微笑,我就知道他不怀好意.果不其然,他扔给了我一个新的需求,要我在 Jav ...

  10. JAVA 解析JSON数据

    JSON 是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java 语言中解析json数 ...

最新文章

  1. node.js学习随笔
  2. github如何make contribute to 其它开源项目
  3. 彩色图像分割MATLAB代码
  4. cordova开发中,android端利用百度sdk定位。
  5. 分割等和子集—leetcode416
  6. Servlet 登录时数据校验
  7. 如何在VS2013中进行Boost单元测试
  8. 模板类出现外部符号无法解析错误
  9. Python type创建类
  10. node csrf 防御 待续
  11. hdu 3501(欧拉函数)
  12. 韩荣温控器nx2使用说明书_如何查看您的Ecobee温控器的使用历史记录
  13. js实现分页并请求ajax,js实现ajax分页完整实例
  14. Qt之QListView的简单使用(含源码+注释)
  15. 如何申请CSDN博客?
  16. IT,互联网,科技,技术博客网站推荐
  17. 智能暖风机——3.利用B3950实现温度采集功能
  18. PHPstudy 数据库基本操作
  19. java + Selenium实现12306自动购票
  20. 推荐一个好的查询快递的网站给大家。

热门文章

  1. Photoshop如何自定义形状
  2. 河南高二计算机会考excel,(完整版)高中信息技术学业水平考试Word、Excel操作题考点总结...
  3. 基于51单片机的多功能温度监测系统(附代码)
  4. 闪迪u盘不能识别好办法_闪迪u盘修复工具,小编教你怎么修复闪迪U盘
  5. Scrapy实例__链家租房爬虫
  6. 读书笔记-人月神话10
  7. 《一》微信小程序简介
  8. 苹果手机中病毒显示无服务器,苹果手机浏览器提示中毒,如图?
  9. 苹果手机自带表格软件_苹果手机还自带扫描仪,没想到今天才发现
  10. 不清楚Word如何批量转PDF?快来跟我学这两个妙招