
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明达内培训的老师今天造了这个简单的JSON库轮子,实现了FastJSON里最常用的toJSON和fromJSON功能,支持Map List Array BeanObject的JSON文本转换,JSON文本解析的话只实现了到Map和List的解析...BeanObject懒得写了,等以后轮子的坑造完了完善后再一起丢到Github玩好了
总之简单的放一下这个毫无效率的MyJSON代码,为了实现简单各种递归应该不复杂,至于兼容性...不知道,没测试多少测试用例,如果有BUG欢迎评论反馈(循环引用会导致生成json文本死循环,对此并不打算修复...嗯,说到底JSON里我怎么才能表示的出循环引用啊
对了,写这个的时候完全没有参考JSON规范....全靠自己对JSON的理解强行撸出来的,如果有不符合规范的地方欢迎指正QwQ
从对象生成JSON(所有的包引用就不贴了)
复制代码
1/**2*根据对象封装到JSON文本,支持Map,List和Bean对象,如果键是一个对象,那么需要自行重写toString3*@paramobject4*@return5*/6publicstaticString toJSON(Object object){7StringBuffer jsonString =newStringBuffer();8if(objectinstanceofMap){9getMapObjectText(jsonString,object);10}elseif(objectinstanceofList ||object.getClass().isArray()){11getListObjectText(jsonString,object);12}else{13getBeanObjectText(jsonString,object);14}15returnjsonString.toString();16}17//从Object中解析并生成JSON字符串,如果无法作为Java Bean解析,则直接toString输出文本18privatestaticvoidgetBeanObjectText(StringBuffer json,Object object) {19inti = 0;20try{21Class c =object.getClass();22Field[] fields =c.getDeclaredFields();23for(Field field : fields){24PropertyDescriptor pd =newPropertyDescriptor(field.getName(), c);25Method getMethod =pd.getReadMethod();26Object value =getMethod.invoke(object);27if(i++ == 0)28json.append("{");29else30json.append(",");31json.append("\"").append(field.getName()).append("\":");32getValueText(json, value);33}34}catch(Exception e){}35if(i != 0)36json.append("}");37else38json.append("\"").append(object.toString()).append("\"");39}40//从Map中解析并生产JSON字符串41privatestaticvoidgetMapObjectText(StringBuffer json,Object object){42Map<Object,Object> map =(Map)object;43json.append("{");44inti = 0;45for(Entry entry : map.entrySet()){46if(entry.getKey() !=null){47if(i++ != 0){48json.append(",");49}50json.append("\"").append(entry.getKey().toString()).append("\":");51getValueText(json, entry.getValue());52}53}54json.append("}");55}56//从List或者Arrays中解析并生成JSON字符串57privatestaticvoidgetListObjectText(StringBuffer json,Object object){58json.append("[");59List list =null;60if(object.getClass().isArray()){61list =Arrays.asList((Object[])object);62}63if(list ==null)64list =(List)object;65inti = 0;66for(Object value : list){67if(i++ != 0)68json.append(",");69getValueText(json, value);70}71json.append("]");72}73//获取value的值并写入json字符串中74privatestaticvoidgetValueText(StringBuffer json,Object value){75if(value ==null){76json.append("null");77return;78}79if(valueinstanceofString)//基本数据类型处理80json.append("\"").append(encoderJsonText(value.toString())).append("\"");81elseif(valueinstanceofInteger)82json.append(((Integer) value).intValue());83elseif(valueinstanceofBoolean)84json.append(((Boolean) value).booleanValue());85elseif(valueinstanceofCharacter)86json.append("\"").append(value.toString()).append("\"");87elseif(valueinstanceofLong)88json.append(((Long) value).longValue());89elseif(valueinstanceofDouble)90json.append(((Double) value).doubleValue());91elseif(valueinstanceofFloat)92json.append(((Float) value).floatValue());93elseif(valueinstanceofMap)//Map List Arrays Bean递归处理94getMapObjectText(json,value);95elseif(valueinstanceofList ||value.getClass().isArray())96getListObjectText(json,value);97else98getBeanObjectText(json, value);99}100//对JSON中的文字进行编码转换,主要是"换行等符号的转义101privatestaticString encoderJsonText(String s){102s = s.replace("\"", "\\\"");103s = s.replace("\\", "\\\\");104s = s.replace("\n", "\\\n");105returns;106}
复制代码
使用方法(Bean对象请自行脑补)
复制代码
1TestBean bean =newTestBean();2bean.setBean1("Stri\"ngTe[]}xt");3bean.setBeanBool(true);4bean.setBeanFloat((float)3.14);5bean.setBeanInt(233);6Map<String,Object> map =newHashMap<>();7map.put("test", "a");8map.put("test2", 0);9map.put("test3",newObject());10Map<String,Object> map2 =newHashMap<>();11map2.put("map2", "qwq");12Object[] array =newObject[]{"1","2",map2};13bean.setBeanMap(map);14bean.setBeanList(Arrays.asList(array));15System.out.println(MyJSON.toJSON(bean));
复制代码
接下来上JSON解析代码,思路和上面一样,全靠递归简化
复制代码
1privatefinalstaticchar[] BLANKLIST =newchar[]{' ','\t','\r','\n'};//空白字符2privatefinalstaticchar[] LISTENDS =newchar[]{',',']'};//LIST结束字符3privatefinalstaticchar[] MAPENDS =newchar[]{',','}'};//MAP结束字符4privatefinalstaticchar[] COLONCHAR =newchar[]{':'};//冒号CHAR5privatefinalstaticchar[] QUOTESCHAR =newchar[]{'"'};//引号CHAR67/**8*解析JSON并返回解析结果,如果是键值对则封装成Map,如果是有序集合则封装成List9*@paramjson10*@return11*/12publicstaticObject fromJSON(String json){13json =json.trim();14if(json.startsWith("{"))15returngetMapObjectFromJson(json,newint[]{1});16elseif(json.startsWith("["))17returngetListObjectFromJson(json,newint[]{1});18else19thrownewIllegalArgumentException("开头不是{或者[");20}21//根据JSON文本封装成Map,pos为当前处理位置22privatestaticMap getMapObjectFromJson(String json,int[] pos){23Map<String,Object> resultMap =newHashMap<>();24while(pos[0] <json.length()){25//跳到第一个"26jumpCharByChars(json, pos, QUOTESCHAR);27//取到下一个"为止是key28String key =getCharsByEnds(json, pos, QUOTESCHAR);29pos[0]++;//跳过"符号30//跳到中间分割字符:31jumpCharByChars(json, pos, COLONCHAR);32//跳到下一个非空值为止33jumpCharByChars(json,pos,null);34pos[0]--;//调回非空值第一个数据35charc = json.charAt(pos[0]);36if(c == '{'){//是一个嵌套Map37pos[0]++;//跳过{符号38resultMap.put(key, getMapObjectFromJson(json, pos));39}elseif(c == '['){//是一个嵌套List40pos[0]++;//跳过[符号41resultMap.put(key, getListObjectFromJson(json, pos));42}elseif(c == '"'){//文本值处理43pos[0]++;44String value =getCharsByEnds(json, pos, QUOTESCHAR);45pos[0]++;46resultMap.put(key, decoderJsonText(value));47}else{//其他格式处理48String value =getCharsByEnds(json, pos, MAPENDS);49resultMap.put(key, getTextValue(value));50}51if(isEnds(json,pos))//是否结束52returnresultMap;53}54thrownewIllegalArgumentException("异常的结尾,请检查JSON字符串是否完整");55}56//根据JSON中的文本值获取对应实例(主要是int bool null三种特殊值)57privatestaticObject getTextValue(String s){58s =s.trim();59if("true".equals(s))60returntrue;61if("false".equals(s))62returnfalse;63if("null".equals(s))64returnnull;65if(s.indexOf(".")==-1){66try{67returnInteger.parseInt(s);68}catch(NumberFormatException e){69returnLong.parseLong(s);70}71}else{72try{73returnFloat.parseFloat(s);74}catch(NumberFormatException e){75returnDouble.parseDouble(s);76}77}78}79//根据JSON文本封装成List,pos为当前处理位置80privatestaticList getListObjectFromJson(String json,int[] pos){81List<Object> resultList =newArrayList<>();82while(pos[0] <json.length()){83jumpCharByChars(json, pos,null);84pos[0]--;85charc = json.charAt(pos[0]);86if(c == '{'){87pos[0]++;88resultList.add(getMapObjectFromJson(json, pos));89}elseif(c == '['){90pos[0]++;91resultList.add(getListObjectFromJson(json, pos));92}elseif(c == '"'){93pos[0]++;94String value =getCharsByEnds(json, pos, QUOTESCHAR);95pos[0]++;96resultList.add(decoderJsonText(value));97}else{98String value =getCharsByEnds(json, pos, LISTENDS);99resultList.add(getTextValue(value));100}101if(isEnds(json,pos))102returnresultList;103}104thrownewIllegalArgumentException("异常的结尾,请检查JSON字符串是否完整");105}106//判断是否结束107privatestaticbooleanisEnds(String json,int[] pos){108inti = pos[0];109while(i <json.length()){110charc = json.charAt(i++);111if(!isBlank(c)){112if(c == '}' || c == ']'){113pos[0] =i;114returntrue;115}elseif(c == ','){116pos[0] =i;117returnfalse;118}else119thrownewIllegalArgumentException("未知的字符[" + c + "],在"+i+"位置");120}121}122thrownewIllegalArgumentException("异常的结尾,请检查JSON字符串是否完整");123}124//根据chars跳过一定数量的位置,如果遇到非空且不在chars中的字符则抛出异常125privatestaticvoidjumpCharByChars(String json,int[] pos,char[] chars){126while(pos[0] <json.length()){127charc = json.charAt(pos[0]);128if(!isBlank(c)){129if(charInChars(c,chars))130break;131thrownewIllegalArgumentException("未知的字符[" + c + "],在"+pos[0]+"位置");132}133pos[0]++;134}135pos[0]++;136if(pos[0] >json.length())137thrownewIllegalArgumentException("异常的结尾,请检查JSON字符串是否完整");138}139//根据ends来获取ends前的所有内容文本,转义字符完整输出不作处理140privatestaticString getCharsByEnds(String json,int[] pos,char[] ends){141CharArrayWriter out =newCharArrayWriter(1);142while(pos[0] <json.length()){143charc = json.charAt(pos[0]);144if(c == '\\'){145out.write(c);146out.write(json.charAt(++pos[0]));147}elseif(charInChars(c,ends)){148break;149}else{150out.write(c);151}152pos[0]++;153}154if(pos[0]+1 >json.length())155thrownewIllegalArgumentException("异常的结尾,请检查JSON字符串是否完整");156String result =null;157result =newString(out.toCharArray());158out.close();159returnresult;160}161//检测字符是不是在字符数组中162privatestaticbooleancharInChars(charc,char[] chars){163if(chars ==null)164returntrue;165for(charcc : chars)166if(cc ==c)167returntrue;168returnfalse;169}170//检测字符是不是空白171privatestaticbooleanisBlank(chars){172for(charc : BLANKLIST)173if(s ==c)174returntrue;175returnfalse;176}177//解码JSON文本,主要是对转义字符的解释178privatestaticString decoderJsonText(String s){179s = s.replace("\\\"", "\"");180s = s.replace("\\\\", "\\");181s = s.replace("\\\n", "\n");182returns;183}
复制代码
使用方法
1publicvoidtest(){2Map m = (Map)MyJSON.fromJSON("{\"test\":[{\"test\":2},{\"test2\":[1,2,3]}]}");3System.out.print(m);4}