需求
给定{"id":"52"},{"id":"8"}
,需要将里面的52,8提取出来,放到数组里备用。
注意
- 52是一个两位数,不应该被识别成5和2
- 该字符串有很强的模式性,数字前面都是
{"id":"
,数字后面都是"}
- 更普遍的方式是采用正则表达式
代码
// 转义后等价于 {"id":"52"},{"id":"8"}
String string="{\"id\":\"52\"},{\"id\":\"8\"}";
int num[]=new int[6],//大小够 数据库标签总个数,或者 单个文章的最多标签数就行
i=0;
//判断是否有 含数字的结构
while(string.contains( "{\"id\":\"" ) )
{
//辅助理解
System.out.println("字符串为:"+string);
System.out.println("{\"id\":\"起始位置:"+string.indexOf("\"id\":\""));
System.out.println("\"}起始位置:"+string.indexOf("\"}"));
// 有数字子串(7是转义后的字符串 {"id":" 的长度)
String subString=(string.substring( string.indexOf("{\"id\":\"")+7,string.indexOf("\"}")));
num[i]=Integer.parseInt(subString);
System.out.println("数字"+num[i]);
i++;
// 输出玩该数字后,删除掉该结构{"id":"5"} 变为 ,{"id":"8"}
// 因为 "}长为2,要删除到 "}的}位置
string=string.replace(string.substring( string.indexOf("{\"id\":"),string.indexOf("\"}")+2),"");
}
应用:
获取js传来的json格式的param里 tagArray中的每一个tagId值。关键代码如下:
add_article.js
封装前台页面的数据,提交到后台处理
// 标签(可多选)
var tagId = $(".chosen-select").val();
// alert(tagId);
if(!isEmpty(tagId)){
//即先变字符串,然后分割成 {"id":"5"} {"id":"6"}
var ids = (tagId+"").split("\,");
var tagArray = [];
for(var i=0;i<ids.length;i++){
tagObj = {"id":ids[i]};//好像必须得这种格式
// Alert(tagObj.id);
tagArray.push(tagObj);
}
param["tagArray"] = tagArray;
console.info(tagArray);
}else{
autoCloseAlert("请输入标签",500);
return false;
}
// alert('param='+encodeURI(encodeURI(JSON.stringify(param))));
// 保存文章
$.ajax({
type : "POST",
url : '../article/addContent',
//encodeURI()相当于对前端传输的数据以某种方式进行加密
data : 'param='+encodeURI(encodeURI(JSON.stringify(param)))+"&content="+encodeURI(encodeURI(content)).replace(/\&/g, "%26").replace(/\+/g, "%2B")+"&description="+encodeURI(encodeURI(description)),
success : function(data) { //sucess表示传递到后台给我返回的数据(json)
if(data.resultCode != 'success'){ //状态码
autoCloseAlert(data.errorInfo,1000);
return false;
}else{
//即http://localhost:8080/article/addContent 到了 http://localhost:8080
window.location.href = "../../../";
}
}
});
ArticleController.java
调用方法,完成处理逻辑
String paramDecode = URLDecoder.decode(param, "utf-8");
Article articleDecode = JsonUtil.fromJson(paramDecode, Article.class);
int[] num=articleDecode.stringToNum(articleDecode.getTagArray());
Article.class
定义具体的属性和实现方法
private List<Map<String,String>> tagArray;//添加文章时 暂存 article/add_article.js里 返回的的json形式的tagId
//param会有多个对象(所以List),每一个都可认为是key-value形式(所以Map<String,String>)
// 可以发现只有定义成List<Map<String,String>> ArticleController里的JsonUtil.fromJson(paramDecode, Article.class);才不会报错且能拿到数值
public String tagArrayToString( List<Map<String,String>> tagArray) {
return "" + tagArray; //加“” 变字符串
}
public int[] stringToNum(List<Map<String,String>> tagArray){
String string=tagArrayToString(tagArray);
// 转义后等价于 [{id=5}, {id=6}]
int num[]=new int[5],//大小够 数据库标签总个数,或者 单个文章的最多标签数就行
size=0;//有效数字个数
//判断是否有 含数字的结构
while(string.contains( "{id=" ) )
{
//辅助理解
// System.out.println("字符串为:"+string);
// System.out.println("{id=起始位置:"+string.indexOf("{id="));
// System.out.println("}起始位置:"+string.indexOf("}"));
// 有数字子串(7是转义后的字符串 {"id":" 的长度)
String subString=(string.substring( string.indexOf("{id=")+4,string.indexOf("}")));
num[size]=Integer.parseInt(subString);
// System.out.println("数字:"+num[size]);
size++;
// 输出玩该数字后,删除掉该结构{"id":"5"} 变为 ,{"id":"8"}
// 因为 "}长为2,要删除到 "}的}位置
string=string.replace(string.substring( string.indexOf("{id="),string.indexOf("}")+1),"");
}
num = Arrays.copyOf(num, size);//缩容,只留有效数字个元素
return num;
}