#2020.3.9
#使用requestBody来接收复杂的json数据串。
上回提到“复选框怎么能一次接受多个值”
但是似乎没有找到答案。取而代之的是,使用table,将所有的数据罗列出来,然后利用jQuery,将需要的数据形成json数据串,发送给后台。
一、例如:jQuery的方法可以这样:
function get_table_data(){
var src=$("tr.tdtrade");//选取所有带数据的行<tr>
var result=[];
var cnt=src.length;
for(var i=0;i<cnt;i++){
var tds=src[i].cells;
if(tds.length>0){ //根据需要将数据插入,形成一个json对象。result.push({'pid':tds[0].innerHTML,'price':tds[2].innerHTML*100,'feature':tds[3].innerHTML,'discounts':tds[4].innerHTML,'cnt':tds[5].innerHTML});
}
}
return result;//切记这个json对象要转换成json字符串才能识别。
};
var result = get_table_data();
var des=JSON.stringify(result); ///转换为字符串。
二、数据通过ajax发送:
$.ajax({
type: "post",
dataType: "json",
url: "genTrade",
contentType: "application/json;charset=UTF-8",//指定消息请求类型
data: dattt,//将js对象转成json对象
success: function (data) {
console.log(data);
}
});
三,使用requestBody来接受这些参数。
ps:需要要明确的是,requestBody只能接受json字符串!不接受json对象。
默认是什么类型的JSON字符串都可以接收的。但是如果遇到bean的属性比较复杂或者和我这里一样,包含了collection属性的。就需要自己定义了。
1、首先:自己写一个类继承:这里由于是我的bean中包含了List,所以需要将json字符串转换为这个格式。
public class SubTradeDeserializer extends JsonDeserializer<Collection>
实现方法:
public Collection<ReqSubTrade> deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
lp.getText();///就是要转换的json数据。
ObjectMapper mapper = new ObjectMapper();
....
}
2、下面两种方法都可以:
//(1)种方法。
List<ReqSubTrade> list = mapper.readValue(p.getText(),
new TypeReference<List<ReqSubTrade>>() {});// 这个方法也是可以的。
//(2)种方法
JavaType type = TypeFactory.defaultInstance().constructCollectionType(List.class, ReqSubTrade.class);
List<ReqSubTrade> list = mapper.readValue(p.getText(), type);
3、最后:在requestBody bean相应的setter方法上加上注解: 切忌。
@JsonDeserialize(using = SubTradeDeserializer.class)
public void setSubTrades(List<ReqSubTrade> subTrades) {
this.subTrades = subTrades;
}
这样从前台发送json数据就可以正常转为指定的bean了。