在asmx的方法调用中,如果方法要求有返回值,那在return JSON字符串时,JSON串会被加上XML外壳,所以在接收端接收时,要先去掉XML外壳,代码如下
string url = http://123/pppp/list.asmx/getcs;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
string result = "";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd(); // 这里就是接口输出的内容
}
}
// 转成DataTable
DataTable dtTotal = JsonToDataTable(result);
public DataTable JsonToDataTable(string json)
{
// ======================
// 关键修复:提取纯JSON
// ======================
int start = json.IndexOf("[");
int end = json.LastIndexOf("]");
if (start >= 0 && end > start)
{
json = json.Substring(start, end - start + 1);
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] objArray = null;
try
{
objArray = serializer.Deserialize<object[]>(json);
}
catch
{
return new DataTable();
}
DataTable dt = new DataTable();
if (objArray == null || objArray.Length == 0)
return dt;
var firstRow = (System.Collections.Generic.Dictionary<string, object>)objArray[0];
foreach (var key in firstRow.Keys)
{
dt.Columns.Add(key, typeof(string));
}
foreach (var item in objArray)
{
var rowDict = (System.Collections.Generic.Dictionary<string, object>)item;
DataRow row = dt.NewRow();
foreach (var key in rowDict.Keys)
{
if (rowDict[key] == null)
row[key] = "";
else
row[key] = rowDict[key].ToString();
}
dt.Rows.Add(row);
}
return dt;
}
如果方法中不要求有返回值,可以使用下面方式输出纯JSON字符串
Context.Response.Charset = "UTF-8";
Context.Response.Write(serJson); //只输出Json字符串,不带文件头


