问题描述
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.Configuration;usingSystem.Data;usingSystem.Data.SqlClient;publicpartialclasstestttttttttttttt_输出Json格式:System.Web.UI.Page{string_conn=WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;protectedvoidPage_Load(objectsender,EventArgse){if(!Page.IsPostBack){get_json();}}publicvoidget_json(){stringjson="{";DataTabledt=get_data();for(inti=0;i<dt.Rows.Count;i++){json=json+"""+dt.Rows[i]["brandname"].ToString()+"":"+dt.Rows[i]["proname"].ToString()+"",";}json=json.Substring(0,json.Length-1);json+="}";Response.Write(json);}publicDataTableget_data(){SqlConnectioncon=newSqlConnection(_conn);SqlCommandcmd=newSqlCommand();cmd.Connection=con;cmd.CommandText="selecttop10*fromdatawherebrandid='3'";SqlDataAdaptersda=newSqlDataAdapter(cmd);DataTabledt=newDataTable();using(sda){sda.Fill(dt);}returndt;}}
得到能传给另外一个页面的纯JSON数据
解决方案
解决方案二:
前台发送ajax请求到后台一般处理程序,后台获取datatable后先转为对象(需要先建实体类),再通过JavaScriptSerializer类序列化返回前台。前台调用jQuery的$.parseJSON()方法反序列化为对象,通过js的for循环遍历对象取出元素,并拼接html语句另外,一些jQuery的grid插件可以直接将json字符串作为参数设置数据源
解决方案三:
引用1楼yaotomo的回复:
前台发送ajax请求到后台一般处理程序,后台获取datatable后先转为对象(需要先建实体类),再通过JavaScriptSerializer类序列化返回前台。前台调用jQuery的$.parseJSON()方法反序列化为对象,通过js的for循环遍历对象取出元素,并拼接html语句另外,一些jQuery的grid插件可以直接将json字符串作为参数设置数据源
我这样拼接不行吗?亲能给段代码,模仿一下吗?
解决方案四:
加句Response.ContentType设定,具体你新增个handler一般处理程序,里面默认有
解决方案五:
正常的数据服务,不要使用aspx,应该使用ashx。
解决方案六:
引用楼主qq_25693923的回复:
得到能传给另外一个页面的纯JSON数据
asp.net页面,是用来解析、编译、生成页面输出html的,不是传出“纯json数据”的。在页面中不得以、不得不写Response.End()这类语句,但是性能损耗(创建了无意义的Page对象,经历了完整的页面生命周期)已经造成了。所以应该使用ashx。
解决方案七:
例如在帖子中的第#8楼,我写了一个例子,可以把任意的关系数据查询结果转为json格式输出给客户端。但其实不需要DataTable,而是使用更为高效的List<ExpandoObject>(因为它只是暂存自由模式的对象数据,而并不需要内存数据库架构)。
解决方案八:
引用4楼sp1234的回复:
正常的数据服务,不要使用aspx,应该使用ashx。
引用2楼qq_25693923的回复:
Quote: 引用1楼yaotomo的回复:
前台发送ajax请求到后台一般处理程序,后台获取datatable后先转为对象(需要先建实体类),再通过JavaScriptSerializer类序列化返回前台。前台调用jQuery的$.parseJSON()方法反序列化为对象,通过js的for循环遍历对象取出元素,并拼接html语句另外,一些jQuery的grid插件可以直接将json字符串作为参数设置数据源我这样拼接不行吗?亲能给段代码,模仿一下吗?
<%@WebHandlerLanguage="C#"Class="返回Json数据"%>usingSystem;usingSystem.Web;usingSystem.Web.Configuration;usingSystem.Data;usingSystem.Data.SqlClient;publicclass返回Json数据:IHttpHandler{string_conn=WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;publicvoidProcessRequest(HttpContextcontext){SqlConnectioncon=newSqlConnection(_conn);SqlCommandcmd=newSqlCommand();cmd.Connection=con;cmd.CommandText="selecttop10*fromdata";SqlDataAdaptersda=newSqlDataAdapter(cmd);DataTabledt=newDataTable();using(sda){sda.Fill(dt);}stringjson="{";for(inti=0;i<dt.Rows.Count;i++){json=json+"""+dt.Rows[i]["brandname"].ToString()+"":"+dt.Rows[i]["proname"].ToString()+"",";}json=json.Substring(0,json.Length-1);json+="}";context.Response.ContentType="text/plain";context.Response.Write(json);}publicboolIsReusable{get{returntrue;}}}
这样得到了纯文本的内容:{"苹果":橘子"......这咋整啊?这不对啊
解决方案九:
参考下其他人的例子做做就行了嘛
解决方案十:
这个贴子,看得难受。你先下载:然后加入下面的类。要格式化DataTable易如反掌注:自己拼字符串是不当的,很容易出错。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Data;usingSystem.IO;usingNewtonsoft.Json;usingSystem.Web;usingSystem.Reflection;usingSystem.Collections;usingSystem.Text.RegularExpressions;//缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”namespaceSystem.Runtime.CompilerServices{publicclassExtensionAttribute:Attribute{}}namespaceUtil{///<summary>///Author:yenange///Date:2013-12-11///Description:json辅助类///</summary>publicclassJsonHelper{///<summary>///DataSet转JSON.addbyngye,on2013-02-18.///</summary>///<paramname="ds">需要转换的数据源ds</param>///<returns>json字符串</returns>publicstaticstringDataSetToJson(DataSetds){stringjson=string.Empty;if(ds==null)returnjson;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);try{using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();foreach(DataTabledtinds.Tables){jw.WriteStartObject();jw.WritePropertyName(dt.TableName);jw.WriteStartArray();foreach(DataRowdrindt.Rows){jw.WriteStartObject();foreach(DataColumndcindt.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();}jw.WriteEndArray();jw.WriteEndObject();}jw.WriteEndArray();sw.Close();jw.Close();}}catch(Exceptionex){returnex.Message;}returnsb.ToString();}///<summary>///DataTable转JSON///</summary>///<paramname="atable_data">数据源DataTable</param>///<returns>返回DataTable转换成功的Json格式</returns>///publicstaticstringDataTableToJson(DataTabledt){strings_jsonstring=string.Empty;//参数检测if(dt==null)returns_jsonstring;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();foreach(DataRowdrindt.Rows){jw.WriteStartObject();foreach(DataColumndcindt.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();}jw.WriteEndArray();sw.Close();jw.Close();}returnsb.ToString();}///<summary>///把DataRow转换为Json格式///</summary>///<paramname="dr">行记录信息</param>///<returns>返回DataRow转换成功的Json格式</returns>publicstaticstringDataRowToJson(DataRowdr){stringjsonString=string.Empty;//参数检测if(dr==null)returnjsonString;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);DataTabletableData=dr.Table;using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();jw.WriteStartObject();foreach(DataColumndcintableData.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();jw.WriteEndArray();sw.Close();jw.Close();}returnsb.ToString();}///<summary>///将json输出到客户端///</summary>///<paramname="json">Json格式内容</param>publicstaticvoidResponseWriteJson(Stringjson){HttpContext.Current.Response.ContentType="text/json";HttpContext.Current.Response.Write(json);}#regionJson的序列化和反序列化///<summary>//////</summary>///<paramname="obj"></param>///<returns></returns>publicstaticstringToJson(objectobj){stringstrJson=string.Empty;try{strJson=Newtonsoft.Json.JsonConvert.SerializeObject(obj,newDateTimeJsonConverter(),newLongJsonConverter());}catch(Exceptionex){//NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);}returnstrJson;}///<summary>//////</summary>///<typeparamname="T"></typeparam>///<returns></returns>publicstaticTFromJson<T>(stringsJson){try{returnNewtonsoft.Json.JsonConvert.DeserializeObject<T>(sJson,newDateTimeJsonConverter(),newLongJsonConverter());}catch(Exceptionex){//NengLong.CMP.Log.Base.Logging.Logger.Current.ErrorFormat("sJson={0}",ex,sJson);//NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);}returndefault(T);}#endregionprivateclassDateTimeJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(DateTime).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){DateTimedt=(DateTime)value;writer.WriteValue(dt.ToString("yyyy-MM-ddHH:mm:ss"));}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){returnDateTime.Parse(reader.Value.ToString());}}privateclassLongJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(long).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){writer.WriteValue(value.ToString());}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){longv=0;long.TryParse(reader.Value.ToString(),outv);returnv;}}privateclassStringJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(string).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){writer.WriteValue(value.ToString());}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){returnSystem.Web.HttpUtility.UrlDecode(reader.Value.ToString());}}}}
解决方案十一:
参考:相关:
解决方案十二:
引用10楼insus的回复:
参考:相关:
参考了,按照第一个帖子里面的例子,也得出了与我上面内容一样的结果,所以:我拼接字符串应该也是正确的我明白了,应该是JQUERY部分的代码有问题,造成了这样的输出,实际json字段的生成已经OK了
解决方案十三:
引用9楼yenange的回复:
这个贴子,看得难受。你先下载:然后加入下面的类。要格式化DataTable易如反掌注:自己拼字符串是不当的,很容易出错。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Data;usingSystem.IO;usingNewtonsoft.Json;usingSystem.Web;usingSystem.Reflection;usingSystem.Collections;usingSystem.Text.RegularExpressions;//缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”namespaceSystem.Runtime.CompilerServices{publicclassExtensionAttribute:Attribute{}}namespaceUtil{///<summary>///Author:yenange///Date:2013-12-11///Description:json辅助类///</summary>publicclassJsonHelper{///<summary>///DataSet转JSON.addbyngye,on2013-02-18.///</summary>///<paramname="ds">需要转换的数据源ds</param>///<returns>json字符串</returns>publicstaticstringDataSetToJson(DataSetds){stringjson=string.Empty;if(ds==null)returnjson;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);try{using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();foreach(DataTabledtinds.Tables){jw.WriteStartObject();jw.WritePropertyName(dt.TableName);jw.WriteStartArray();foreach(DataRowdrindt.Rows){jw.WriteStartObject();foreach(DataColumndcindt.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();}jw.WriteEndArray();jw.WriteEndObject();}jw.WriteEndArray();sw.Close();jw.Close();}}catch(Exceptionex){returnex.Message;}returnsb.ToString();}///<summary>///DataTable转JSON///</summary>///<paramname="atable_data">数据源DataTable</param>///<returns>返回DataTable转换成功的Json格式</returns>///publicstaticstringDataTableToJson(DataTabledt){strings_jsonstring=string.Empty;//参数检测if(dt==null)returns_jsonstring;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();foreach(DataRowdrindt.Rows){jw.WriteStartObject();foreach(DataColumndcindt.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();}jw.WriteEndArray();sw.Close();jw.Close();}returnsb.ToString();}///<summary>///把DataRow转换为Json格式///</summary>///<paramname="dr">行记录信息</param>///<returns>返回DataRow转换成功的Json格式</returns>publicstaticstringDataRowToJson(DataRowdr){stringjsonString=string.Empty;//参数检测if(dr==null)returnjsonString;StringBuildersb=newStringBuilder();StringWritersw=newStringWriter(sb);DataTabletableData=dr.Table;using(JsonWriterjw=newJsonTextWriter(sw)){JsonSerializerser=newJsonSerializer();jw.WriteStartArray();jw.WriteStartObject();foreach(DataColumndcintableData.Columns){jw.WritePropertyName(dc.ColumnName);ser.Serialize(jw,dr[dc].ToString());}jw.WriteEndObject();jw.WriteEndArray();sw.Close();jw.Close();}returnsb.ToString();}///<summary>///将json输出到客户端///</summary>///<paramname="json">Json格式内容</param>publicstaticvoidResponseWriteJson(Stringjson){HttpContext.Current.Response.ContentType="text/json";HttpContext.Current.Response.Write(json);}#regionJson的序列化和反序列化///<summary>//////</summary>///<paramname="obj"></param>///<returns></returns>publicstaticstringToJson(objectobj){stringstrJson=string.Empty;try{strJson=Newtonsoft.Json.JsonConvert.SerializeObject(obj,newDateTimeJsonConverter(),newLongJsonConverter());}catch(Exceptionex){//NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);}returnstrJson;}///<summary>//////</summary>///<typeparamname="T"></typeparam>///<returns></returns>publicstaticTFromJson<T>(stringsJson){try{returnNewtonsoft.Json.JsonConvert.DeserializeObject<T>(sJson,newDateTimeJsonConverter(),newLongJsonConverter());}catch(Exceptionex){//NengLong.CMP.Log.Base.Logging.Logger.Current.ErrorFormat("sJson={0}",ex,sJson);//NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);}returndefault(T);}#endregionprivateclassDateTimeJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(DateTime).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){DateTimedt=(DateTime)value;writer.WriteValue(dt.ToString("yyyy-MM-ddHH:mm:ss"));}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){returnDateTime.Parse(reader.Value.ToString());}}privateclassLongJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(long).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){writer.WriteValue(value.ToString());}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){longv=0;long.TryParse(reader.Value.ToString(),outv);returnv;}}privateclassStringJsonConverter:Newtonsoft.Json.JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returntypeof(string).IsAssignableFrom(objectType);}publicoverridevoidWriteJson(Newtonsoft.Json.JsonWriterwriter,objectvalue,Newtonsoft.Json.JsonSerializerserializer){writer.WriteValue(value.ToString());}publicoverrideobjectReadJson(Newtonsoft.Json.JsonReaderreader,TypeobjectType,objectexistingValue,Newtonsoft.Json.JsonSerializerserializer){returnSystem.Web.HttpUtility.UrlDecode(reader.Value.ToString());}}}}
大哥,你这个写法太复杂了,一时半会儿看不懂啊
解决方案十四:
不需要懂,学会用就好了。json自己拼接很容易出问题的,比如字符串里有特殊字符如:双引号。Util.JsonHelper.DataTableToJson(dt);
解决方案十五:
stringjson=Util.JsonHelper.DataTableToJson(dt);
解决方案:
为什么要将整个json传到另一页面,将brandid='3'这个参数传过去之后,在那边取数据,拼接json不好吗。
解决方案:
引用14楼yenange的回复:
stringjson=Util.JsonHelper.DataTableToJson(dt);
谢谢!引用15楼BitCoffee的回复:
为什么要将整个json传到另一页面,将brandid='3'这个参数传过去之后,在那边取数据,拼接json不好吗。
在另外一个页面做搜索推荐功能
解决方案:
<scriptsrc="js/jquery.js"type="text/javascript"></script><scripttype="text/javascript">$(document).ready(function(){var$autocomplete=$('<ulclass="autocomplete"></ul>').hide().insertAfter('#search-text');$('#search-text').keyup(function(){$.ajax({'url':'输出json.ashx','data':{'search-text':$('#search-text').val()},'dateType':'json','success':function(data){if(data.length){$autocomplete.empty();$.each(data,function(index,term){$('<li></li>').text(term).appendTo($autocomplete);});$autocomplete.show();}}});});});</script>
问题应该出在这里,结果把每2个字符当作一个term放入<li><li/>中,想要的是把每一个json以逗号分隔的Value的放进来