后端需要一个json对象,对象里面有map类型属性,前端好像没有map类型数据,那么怎么弄呢? 5C

后端需要一个json对象,对象里面有map类型属性,前端好像没有map类型数据,那么怎么弄呢?非要改后端吗,那么太不方便了,前端怎么解决这个问题哇

10个回答

{
"dataList" :[

{
"name" : "name1",
"pwd" : "123",
"adress" : "上海"
},
{
"name" : "name2",
"pwd" : "123",
"adress" : "上海"
}

],
"datalist2" :[
{
"name" : "name3",
"pwd" : "123",
"adress" : "上海"
},
{
"name" : "name4",
"pwd" : "123",
"adress" : "上海"
}
]

}



把前台数据改成这种格式的数据就好了

json本来是javascript里的内容,有时后端要传各种各样的数据格式来适应前端,所以需要用到json来转换,用它来表示各种各样复杂的数据,如对象,数组,集合,以及集合的集合等数据。
先来了解json是什么,json是一种轻量级的前端后端以及网络传输的数据交换格式,就是一串字符串,只不过元素会使用特定的符号标注。 {} 双括号表示对象,[] 中括号表示数组,”” 双引号内是属性或值,: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)。也就是说在后端可以把一个字符串,然后通过json来转换成特定的字符串传到前端去。

你的map传过去就是就转换成json了。传的时候不是同样吗?

不就是字符串么 ? 再说你后端需要的是包含map类型的json 也其实还是字符串 . 很容易的转换 , 改后端来的快些

不存在的,json只是一种数据类型,分为两种格式,列表形式,键值对形式,,,,不管怎么样都可以转成js中的对象,,,你map就会转成键值对形式,,,前端直接使用就好了

谢谢大家,我自己已经解决
图片说明

"{
\"name\" : \""+变量+"\",
\"pwd\" : \""+变量+"\"
}"

es6里面有map类型,你可以搜一下,还有set类型可供使用

 要看你是传统的开发还是现在ES6新语法在开发

原理就是Json对象里还是放Json对象,
可以
var obj = {};
obj.id = info.id; //这里id是key 的名称

也可以
var obj = {};
obj["id"] = info.id; //这里id也是key 的名称

甚至可以
obj[id] = info.id;

//这里的id就是变量了,可以赋值 ,比如以遍历对象的id准确的值作为key

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
前端向后端传递复杂json类型遇到的问题

$("#btn").click(function(){ var data={ header:{appId:'erghege',secret:'gergergeg'}, user:{name:'jery',pasword:'1132332'} } $.ajax({ url:"testjson.spring", data:data, dataType:"json", contentType:"application/json", success:function(){ } }); 我封装了一个类 public class Meta { private User user; private Header header; //...... } @RequestMapping("/testjson") @ResponseBody public Map<String, Object> logout(Meta meta){ Map<String, Object> map = new HashMap<String, Object>(); map.put("status", "1"); return map; } 让Meta 接收前台传递过来的 json,报Invalid property 'header[appId]' of bean class [com.test.Meta]: Property referenced in indexed property path 'header[appId]' is neither an array nor a List nor a Map; returned value was [erghege] 有什么方法解决一下么

求大佬帮助!java后端怎么构造这种json?

有2个实体类,一个是学生基本信息(主键学生id), 还有一个是学生成绩表(有一个字段学生id 通过 ``` select * from grade where id=20 查出来的是多行 ``` ``` { "data": [{ "name": "张三", "sex": "男", "grade": { "chinses": [{ "one": "88", "two": "98", "three": "95", "four": "55" }], "math": [{ "one": "88", "two": "98", "three": "95", "four": "55" }] } }] } ``` 但是,这2个实体类怎么搞 不知道怎么关联 可以 分别 select * from XX 然后 new Gson().tojson(集合) 或者 JSONArray.parseArray(JSON.toJSONString(list)); 这前端需要的json数据格式还有很大的差距 好像要在实体类中私有化 list 或者 map 然后该怎么操作呢........................

后端传过来一个list<对象>的类型,前端怎么把把每个对象中的每一个值取出来?

questionList = '<%=request.getAttribute("allMessage")%>'; for(var i=0;i<questionList.length;i++){ var title = questionList[0].title; } list<对象>为allMessage allMessage的值为[cn.yidong.pojo.message@bfd0a376 {CC:0, A:红, BC:0, B:橙色, AC:0, C:黄, D:蓝, jid:2, E:null, F:null, title:颜色1, type:单选, tnumber:123, id:2, FC:0, EC:0, DC:0}, cn.yidong.pojo.message@c17e3932 {CC:0, A:花, BC:0, B:庄, AC:0, C:1, D:2, jid:2,.....................

前端传来一个json格式的数据,我用的map接,然后我想在pojo类以String类型存到数据库,查询时再从数据库中查出转map返回,现在我不想不创建一个dto类,请问有更好的解决方法吗?

前端传来一个json格式的数据,我用的map接,然后我想在pojo类以String类型存到数据库,查询时再从数据库中查出转map返回,现在我不想不创建一个dto类,请问有更好的解决方法吗?![图片说明](https://img-ask.csdn.net/upload/201910/09/1570592110_936734.png)

后台传来的json对象在前端页面显示不完整

前端用的vue,有什么可能的原因吗,其他的也有这样的情况,随机不显示某个字符 ![图片说明](https://img-ask.csdn.net/upload/201812/03/1543829029_245402.png)

js 解析后台传来的map的json数据,怎么得到key的值,key 是一个对象

Map < Activitytype, List < Activity > > js怎么得到Activitytype里面属性的值

vue怎样在页面上解析传过来的JSON格式的java对象或数组?

![图片说明](https://img-ask.csdn.net/upload/201910/21/1571625719_359196.png) snapshop 是传过来的json对象或数组

这是服务器端获取的json,但不知道怎样转成对象,这是map转化的json吗?该怎么转化

![图片说明](https://img-ask.csdn.net/upload/201510/03/1443871236_684373.png)

从后台获取到的map类型数据,前端js如何获得map的key和value,急急急!!!秋梨膏!

我从后台获取到的map类型数据是这样的: ``` Map<Map<String,String>,Double> ``` 前端通过Ajax请求得到上边的数据,那么我在ajax的success函数里怎么获得 里面那个map的key和value呢 我是下面这么写的, 为啥不行 ``` var getLinks = function(){ var result = []; var temp = {}; $.ajax({ url: "toFPtree", dataType: "json", type: "post", async: false, success : function(data){ for (var keys in data){ for(var k in keys){ temp = {source : k, target : keys[k], value : data[k]}; result.push(temp); } } } }); return result; }; ``` 急急急!!!

如何用JS 向action 传递一个 list<map>对象

大概知道用json 但是能具体一点吗?如何将这个list变成json格式,还有action那边如何获取list的里面的map的值

后台返回的list集合,前端如何转为json?

返回值 =》 {addamount=0.00, planned_principal=0.00, product_id=0, plancount=0, repaid_amount=0.00, overdueamount=0.00, planned_interest=0.00, balance_principal=0.00, overpayment=0.00, repaid_interest=0.00, repaycount=0, overduecount=0, addcount=0, feeamount=0.00, name=业主贷, repaid_principal=0.00} eval,JSON.stringify(), JSON.parse()都不能解析;

SpringMVC - 前台传JSON数据到后台,那后台是不是只能用Map或者实体类?

前台传JSON数据到后台,那后台是不是只能用Map或者实体类? 因为有一个项目几乎每次传来的JSON都很复杂,那岂不是都只能用Map和实体类了,而且一些简单的读取也只能用Map感觉到小题大做(前提是前端一律传JSON数据)。 这该如何处理?目前想到的是用拦截器将参数转化下,但是这个通用的模块该怎么写呢?

用react ajax获取到json数据后怎么通过map方法循环输出??

刚开始学react,从react 的ajax方法从后台php中获取返回的数据,并输出,卡在不知道如何输出上了。。代码如下, <script type="text/babel"> class ListGet extends React.Component { constructor() { super(); this.state = {list:''}; } componentDidMount() { this.serverRequest = $.get("listindex.php",function (data,status) { {/*this.setState({ list:(eval('(' + data + ')'))[0].id });*/} const numbers = eval('(' + data + ')'); listItems = numbers.map((numbers) => <li>{numbers.id}</li> ); }.bind(this)); } componentWillUnmount() { this.serverRequest.abort(); } const listItems; render() { return ( <div> {/*this.state.list*/} {listItems} </div> ); } } ReactDOM.render( <ListGet />, document.getElementById('app') ) </script> 我后台返回的是json字符串,我先把它json对象化,然后想用map方法输出,但是怎么写都报错。。我想问下应该怎样写才对??

get请求,参数其中有一个是json数据,如何解决?

介绍一下,这一步是拿到签名sign,接下来用sign去另外一个接口获取信息。 这种情况拿不到返回值,但是我把json数据编码后就能拿到了,为什么? 还有就是就算拿到了也没法用,下一步用得到的sign拿信息的时候,传编码后的json数据会返回参数错误,传不编码的json数据返回sign值不对。接口我也不知道他怎么写的,有没有大佬帮忙解决一下,只从前端的角度 var json ={"type":id} var obj = { app_id:"njsyjgljyy", interface_id:"xwlbjk", version:"1.0", charset:"utf-8", biz_content:json, timestamp:tmp, origin:'1' } $.ajax({ url:"http://www.jszwfw.gov.cn/jimp/sign/createsign.do", type:'get', data:obj, dataType: 'text', success:function(res){ var sign = res; console.log(json) } })

springmvc的controller可不可以实现跳转页面的同时传json数据到前台js?

我知道modelAndView这些方法,就是想问问可不可以实现跳转页面并让前台跳转的页面接受json数据![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/22.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/22.gif)

后台传来的json数组的id值 和 前端修改的值就行整合

**完整的json数组包含一个小的json数组 点击完整json数组的其他元素时小json数组返回的值也没了** ** 实际上点击任何一个元素 之前的都会消失 而且心 和肝 点击后背景不会退掉** ``` var arr1 = [ { "name" : "心", "acupoint_num" : "1" }, { "name" : "肝", "acupoint_num" : "2" }, { "name" : "脑袋", "acupoint_num" : "3" }, { "name" : "屁股", "acupoint_num" : "4" } ]; var retStr = ","; $('#xueweiList').append( $(arr1).map( function() { return '<li id=' + this.acupoint_num + '><a href="#" >' + this.name + '</a></li><li>' }).get().join('')); $("#nav>ul>li").click( function() { var focus = $(this).toggleClass('h_nav_over') .hasClass('h_nav_over'); if (focus) retStr += this.id + ','; else retStr = retStr.replace(',' + this.id + ',', ','); $("#xueweis").val(retStr.replace(/^,|,$/g, '')); }); /* 2-获取疾病对应穴位 */ var arr2 = [ { "earName" : "心", "acupoint_num" : "1" }, { "earName" : "肝", "acupoint_num" : "2" } ]; var arrStr2 = ''; var xueweisStr = ""; $.each(arr2, function(index2, item) { // 获取后台传来的json是数组 arrStr2 += "<input type='button' id='" + arr2[index2].acupoint_num + "' value='" + arr2[index2].earName + "' name='earName'/>"; $.each(arr1, function(index, item) { if(arr2[index2].acupoint_num==arr1[index].acupoint_num){ $("#"+arr1[index].acupoint_num).css({"background-color":"#98bf21"}); $("#xueweis").val(xueweisStr);//直接用js返回对应的穴位值给inupt赋值 } }); xueweisStr += arr2[index2].acupoint_num + ","; }); $("#xueweis").val(xueweisStr);//直接用js返回对应的穴位值给inupt赋值 var td2 = document.getElementById("xueweiTd2"); var div2 = document.getElementById("xuewei2"); div2.innerHTML = arrStr2; td2.appendChild(div2); }); ``` 这个是没有点击脑袋之前 小的json数组包含 1 和2 两个id 对应 心和肝 ![图片说明](https://img-ask.csdn.net/upload/201607/21/1469094478_441858.png) 这个是点击脑袋之后 1 和2 都没有了 ![图片说明](https://img-ask.csdn.net/upload/201607/21/1469094529_702469.png)

前台js接收后台传过来的json数据

前台js接收后台传过来的json数据 前台怎么将json数据根据“名称”字段进行分组,并分别显示组名和每一个组有多少条记录

js遍历JSON排序问题,总是自动排序

如图这是我从后端拿到的JSON数据,前面的key是编号,比如图中的5、1、2、8,我拿到的数据是按照里面的accessCount的大小已经排好序的,但是当我在前端使用$.each()进行遍历的时候,前端是按照key值的大小升序输出的,也就是按照key值1、2、5、8进行遍历的。请问怎么才能不这样呢?我就想按照图中的这个输出

web中前台传给后台的数据类型有哪些?后台给前台的数据类型有哪些?

目前所知,前台向后台传送数据的方式是通过string或者json类型。 而后台返回给前台的数据类型可以是String或者是对象或者map,因为前台的el表达式 可以直接解析对象. 如果返回的值map类型,那么可以直接通过map.key的方式来访问其属性。 但是在通过.访问对象的时候必须要求,该属性在对象中有对应的get/set对应的方法。 目前,所知前后台的传输类型不知是否齐全,欢迎补充

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Linux 会成为主流桌面操作系统吗?

整理 |屠敏出品 | CSDN(ID:CSDNnews)2020 年 1 月 14 日,微软正式停止了 Windows 7 系统的扩展支持,这意味着服役十年的 Windows 7,属于...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

学习总结之HTML5剑指前端(建议收藏,图文并茂)

前言学习《HTML5与CSS3权威指南》这本书很不错,学完之后我颇有感触,觉得web的世界开明了许多。这本书是需要有一定基础的web前端开发工程师。这本书主要学习HTML5和css3,看...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

冒泡排序动画(基于python pygame实现)

本项目效果初始截图如下 动画见本人b站投稿:https://www.bilibili.com/video/av95491382 本项目对应github地址:https://github.com/BigShuang python版本:3.6,pygame版本:1.9.3。(python版本一致应该就没什么问题) 样例gif如下 ======================= 大爽歌作,mad

Redis核心原理与应用实践

Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 b...

现代的 “Hello, World”,可不仅仅是几行代码而已

作者 |Charles R. Martin译者 | 弯月,责编 | 夕颜头图 |付费下载自视觉中国出品 | CSDN(ID:CSDNnews)新手...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

程序员毕业去大公司好还是小公司好?

虽然大公司并不是人人都能进,但我仍建议还未毕业的同学,尽力地通过校招向大公司挤,但凡挤进去,你这一生会容易很多。 大公司哪里好?没能进大公司怎么办?答案都在这里了,记得帮我点赞哦。 目录: 技术氛围 内部晋升与跳槽 啥也没学会,公司倒闭了? 不同的人脉圈,注定会有不同的结果 没能去大厂怎么办? 一、技术氛围 纵观整个程序员技术领域,哪个在行业有所名气的大牛,不是在大厂? 而且众所...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

立即提问
相关内容推荐