json数据如下:
String result={
"cpesn":"04520718290098394",
"count":4,
"action":[{"duration":"0","detail":"待机","time":"1564663287821","type":"待机"},
{"duration":"2.5","detail":"开机","time":"1564663288298","type":"开机"},
{"duration":"0.0","detail":"苏州新闻综合高清","time":"1564663288298","type":"广播频道"},
{"duration":"0","detail":"关机","time":"1564663438298","type":"关机"}]
}
其中,action是json对象里的数组,我们可以直接接收json字符串中的cpesn,count,对于action可以存进数组中。
下面对json数据进行解析
//定义一个json对象jo,用来接收解析的JSON字符串result
JSONObject jo = (JSONObject) JSON.parse(result);
//JSONObject jo = new JSONObject(result);//跟上面一句同样的效果
//定义一个json数组jsonArray,用来接收JSON对象里的数组action
JSONArray jsonArray = jo.getJSONArray("action");//从jo对象中获取action数组存进jsonArray中
for(int i=0;i<jsonArray.size();i++)
{
stbaction =new StbAction();//实例化一个stbaction对象
stbaction.cpesn = jo.getString("cpesn");//直接从json对象中获取cpesn
stbaction.CREATE_DATE=CREATE_DATE;//非json字符串中的值
stbaction.COMPLETE_DATE=COMPLETE_DATE;//非json字符串中的值
stbaction.TASK_ID=TASK_ID;//非json字符串中的值
stbaction.count =jo.getString("count");//直接从json对象中获取count
String itemStr = jsonArray.get(i).toString();
JSONObject itemObject = (JSONObject) JSON.parse(itemStr);//获取action数组中第i个json对象
//JSONObject itemObject = (JSONObject)jsonArray.getJSONObject(i); //跟上面2句同样的效果
stbaction.time =itemObject.getString("time");//获取action数组中第i个json对象中的time
stbaction.type =itemObject.getString("type");//获取action数组中第i个json对象中的type
//正则表达式去除json解析的特殊字符串(保留中括号里面的字符)
stbaction.detail =itemObject.getString("detail").replaceAll("[^0-9a-zA-Z\u4e00-\u9fa5.,,。? “”:]", "");
stbaction.duration =itemObject.getString("duration");//获取action数组中第i个json对象中的duration
actionlist.add(stbaction); //把stbaction对象添加到列表
}
正则表达式剔除特殊字符
在上面的代码片段中,我们可以看到有这样一句,利用正则表达式剔除json数据中的无效字符,这里我称它为json数据格式化,考虑到有时候需要将这些数据添加至数据库时不合法的情况。
//正则表达式去除json解析的特殊字符串(保留中括号里面的字符)
stbaction.detail =itemObject.getString("detail").replaceAll("[^0-9a-zA-Z\u4e00-\u9fa5.,,。? “”:]", "");