json库 null,boolen类型解析

语法子集及解析思路:

在这里插入图片描述
当中 %xhh 表示以 16 进制表示的字符,/ 是多选一,* 是零或多个,( ) 用于分组。
上面的子集意思是 json文本是由空白 值 空白组成,空白是空格符/制表符/换行符/回车符的一种,值是null/false/true的一种,每一种有对应的字面值。

解析思路
由于 JSON 语法特别简单,只需检测下一个字符,便可以知道它是哪种类型的值,然后调用相关的分析函数。对于完整的 JSON 语法,跳过空白后,只需检测当前字符:

n ➔ null
t ➔ true
f ➔ false
这三个类型思路都是将json文本和字面值相比较,相同就设置类型并返回成功标识,不相同返回错误消息。

实现过程中遇到的问题;

test_parse_xx函数前两行设置了v.type值,再去解析不是一定会返回错误吗?
lept_parse()函数会根据输入的json文本重新设置v的类型。

这个解析器完成什么工作?
把读入的json文本解析成数据结构(包括类型,值,文本…),供程序调用

lept_context 作用?
为了减少解析函数之间传递多个参数,我们把这些数据都放进一个 lept_context 结构体。刚开始不理解,写到解析数组的时候就知道了,解析过程中除了json文本,还要传递栈,栈容量和栈顶位置。

练习:
修正关于 LEPT_PARSE_ROOT_NOT_SINGULAR 的单元测试,若 json 在一个值之后,空白之后还有其它字符,则要返回 LEPT_PARSE_ROOT_NOT_SINGULAR。

在处理完json一个关键字以后还要继续去掉空格,检查后面是否还有元素,这个操作应该加在哪里?
刚开始我是想加在lept_parse_value的switch语句里,因为case语句会按顺序执行,在检测完n,f,t以后检查空字符时去除空字符看后面还有没有元素,如果有,就返回 LEPT_PARSE_ROOT_NOT_SINGULAR,没有就返LEPT_PARSE_INVALID_VALUE,但是忘记了switch语句如果有return,break等显示打断流的语句,后面的case是不会执行的,也就是说去掉空格函数也许不会执行。后面想到在lept_parse中得到返回结果后再去空格检测是否还有其他字符。

总结

封装是真的强,头文件是写供外部调用的接口,如果这个接口要调用的函数外部不需要知道,就不在头文件中声明,而是定义成了static函数,放在cpp文件中

学习了TDD开发,先写测试,运行测试失败,再写实现代码,再运行测试,失败就修改实现代码,成功就可以想想重构。 方便新添加代码的时候保证原代码的正确性。

源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个SON解析封装类, public class ParsreTools { public static <T> T pasrsJsonStrSimpleT(String jsonString, String key, Class<T> cls) { T t = null; Field fields[] = cls.getDeclaredFields(); String varName[] = new String[fields.length]; for (int i = 0; i < fields.length; i++) { varName[i] = fields[i].getName(); } try { JSONObject jsonObject = new JSONObject(jsonString); JSONObject jsonObject2 = jsonObject.getJSONObject(key); t = cls.newInstance(); for (int i = 0; i < varName.length; i++) { Field field = cls.getDeclaredField(varName[i]); String type = field.getGenericType().toString(); Object object = new Object(); if (type.equals("int")) { object = jsonObject2.getInt(varName[i]); } else if (type.equals("double")) { object = jsonObject2.getDouble(varName[i]); } else if (type.equals("long")) { object = jsonObject2.getLong(varName[i]); } else if (type.equals("boolean")) { object = jsonObject2.getBoolean(varName[i]); } else if (type.equals("class java.lang.String")) { object = jsonObject2.getString(varName[i]); } else if (type.contains("java.util.List")) { int index1 = type.indexOf("<"); int index2 = type.indexOf(">"); type = type.substring(index1 + 1, index2); Class cls1 = Class.forName(type); String jString = jsonObject2.toString(); String key1 = varName[i]; object = pasrsJsonStrMultT(jString, key1, cls1); } else { type = type.replace("class ", ""); Class cls1 = Class.forName(type); String key1 = varName[i]; String jsString = jsonObject2.toString(); object = pasrsJsonStrSimpleT(jsString, key1, cls1); } field.setAccessible(true); field.set(t, object); } } catch (Exception e) { e.printStackTrace(); } return t; } public static <T> List<T> pasrsJsonStrMultT(String jsonString, String key, Class<T> cls) { List<T> list = new ArrayList<T>(); T t = null; Field fields[] = cls.getDeclaredFields(); String varName[] = new String[fields.length]; for (int i = 0; i < fields.length; i++) { varName[i] = fields[i].getName(); } try { JSONObject jsonObject = new JSONObject(jsonString); JSONArray jsonArray = jsonObject.getJSONArray(key); for (int i = 0; i < jsonArray.length(); i++) { t = cls.newInstance(); JSONObject jObject = jsonArray.getJSONObject(i); for (int j = 0; j < varName.length; j++) { Field field = cls.getDeclaredField(varName[j]); String type = field.getGenericType().toString(); Object object = new Object(); if (type.equals("int")) { object = jObject.getInt(varName[j]); } else if (type.equals("double")) { object = jObject.getDouble(varName[j]); } else if (type.equals("long")) { object = jObject.getLong(varName[j]); } else if (type.equals("boolean")) { object = jObject.getBoolean(varName[j]); } else if (type.equals("class java.lang.String")) { object = jObject.getString(varName[j]); } else if (type.contains("java.util.List")) { int index1 = type.indexOf("<"); int index2 = type.indexOf(">"); type = type.substring(index1 + 1, index2); Class cls1 = Class.forName(type); String jString = jObject.toString(); String key1 = varName[j]; object = pasrsJsonStrMultT(jString, key1, cls1); } else { type = type.replace("class ", ""); Class cls1 = Class.forName(type); String key1 = varName[j]; String jsString = jObject.toString(); object = pasrsJsonStrSimpleT(jsString, key1, cls1); } field.setAccessible(true); field.set(t, object); } list.add(t); } } catch (Exception e) { e.printStackTrace(); } return list;
该小项目完整全面整理了java解析json各中写法,以及json的生成、遍历。 该项目收集整理json所需的jar包,使用文档。 /** * json的生成、遍历 */ import java.util.*; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * 该类演示的java数组、字符串、List生成json数组 * Map生成json * 嵌套生成json * json的遍历 * 递归遍历json所有子条目 * @author Administrator * */ public class Test3 { public static void main(String[] args) { String str="{ \"head\":{\"snd_time\":\"20151020234832\",\"snder\":\"S\"} ,\"body\":{\"app_id\":\"APP002\",\"records\":[{\"excp_stat\":\"0\",\"fields\":[{\"req_time\":\"20140828000312\",\"tran_date\":\"121226\"}]}]} }"; System.out.println(str); /*普通数据生成json数组*/ boolean[] boolArray = new boolean[]{true,false,true}; JSONArray jsonArray1 = JSONArray.fromObject( boolArray ); System.out.println( jsonArray1 ); // prints [true,false,true] /*List生成json数组*/ List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSONArray jsonArray2 = JSONArray.fromObject( list ); System.out.println( jsonArray2 ); // prints ["first","second"] /*String生成json数组*/ JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" ); System.out.println( jsonArray3 ); // prints ["json","is","easy"] /*Map生成json*/ Map<Object, Object> map = new HashMap<Object, Object>(); map.put("name", "Ren"); map.put("sex", "man"); map.put("age", 24); JSONObject obj = JSONObject.fromObject(map); System.out.println(obj); //输出结果{"sex":"man","age":24,"name":"Ren"} /*嵌套生成json*/ JSONArray jsonArr = new JSONArray(); JSONObject jsonObj = new JSONObject(); for (int i = 1; i <= 3; i++) { JSONObject tjo = new JSONObject(); tjo.put("optValue", i+""); tjo.put("optText", i+"Text"); jsonArr.add(tjo); } jsonObj.put("options", jsonArr); System.out.println(jsonObj); //输出结果 {"options":[{"optValue":"1","optText":"1Text"},{"optValue":"2","optText":"2Text"},{"optValue":"3","optText":"3Text"}]} /*嵌套生成json*/ JSONObject tobj = new JSONObject(); JSONArray tarr = new JSONArray(); tobj.put("name", "zhangsan"); tobj.put("age", 29); tarr.add(tobj); tarr.add(obj); System.out.println(tarr); //[{"name":"zhangsan","age":29},{"sex":"man","age":24,"name":"Ren"}] tobj.put("other", tarr); System.out.println(tobj); //输出结果 {"name":"zhangsan","age":29,"123":[{"name":"zhangsan","age":29},{"sex":"man","age":24,"name":"Ren"}]} /*json的遍历(单层)*/ String jsonString = tobj.toString(); JSONObject jsonObject = JSONObject.fromObject(str); Iterator keyIter = jsonObject.keys(); while( keyIter.hasNext()) { String key = (String)keyIter.next(); Object value = jsonObject.get(key); System.out.println(key + "--==" + value); } /*测试递归遍历json(多层)*/ System.out.println("---------------------------------------------------------"); getJsonValue(str); } /* * 递归遍历json所有子条目 */ public static String getJsonValue(String json) { if(!json.contains("{") && !json.contains("[") && json.contains(":")) { return json; } else if(json.equals("")){ return json; } else if(json.trim().charAt(0) == '{'){ String value = null; JSONObject jsonObject = JSONObject.fromObject(json); Iterator keyIter = jsonObject.keys(); while( keyIter.hasNext()) { String key = (String)keyIter.next(); value = jsonObject.get(key).toString(); getJsonValue(value); if(!value.contains("{") && !value.contains("[")) { System.out.println(key + " = " + value); } } return value; } else if(json.trim().charAt(0) == '[') { String value = null; JSONArray jsonArr = JSONArray.fromObject(json); for (int i = 0; i < jsonArr.size(); i++) { value = jsonArr.getJSONObject(i).toString(); getJsonValue(value); if(!value.contains("{") && !value.contains("[")) { System.out.println("----"+value); } } return value; } else { return "error"; } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值