Я использую этот код для вызова веб-службы ASP.NET C# для доступа к таблице SQL Server:
HttpResponseMessage message2 = client.GetAsync("GetAll?Columns=*&Tbl=Coding_Sell").Result;
string userJson2 = message2.Content.ReadAsStringAsync().Result;
MessageBox.Show(userJson2);
DataTable DT = JsonConvert.DeserializeObject<DataTable>(userJson2);
Это мой веб-метод:
[WebMethod]
public string GetAll(string Columns, string Tbl)
{
return ObjdBAccess.Get(Columns, Tbl);
}
И связанный с ним класс выглядит следующим образом:
public string Get(string Columns, string TableName)
{
String query = "SELECT " + Columns + " From " + TableName;
createConn();
SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
DataSet DS = new DataSet();
adapter.Fill(DS);
DataTable DT = DS.Tables[0];
closeConn();
return JsonConvert.SerializeObject(DS);
}
Но программа терпит неудачу в этой строке:
DataTable DT = JsonConvert.DeserializeObject<DataTable>(userJson2);
со следующей ошибкой:
При анализе значения обнаружен неожиданный символ: <. Путь '', строка 0, позиция 0.
И это моя переменная userJson2:
<?xml version = "1.0" encoding = "utf-8"?>
<string xmlns = "http://tempuri.org/">{"Table":[{"Main_Code":51,"Property_Name":"Sell","Sub_Code":"1"},{"Main_Code":52,"Property_Name":"Sell2","Sub_Code":"2"}]}</string>
Подскажите, пожалуйста, что не так с моим кодом.





По умолчанию веб-метод ASP.NET возвращает ответ в формате XML. Вам следует изменить ответ, чтобы он возвращался в формате JSON:
[WebMethod]
public static void GetAll(string Columns, string Tbl)
{
HttpContext.Current.Response.ContentType = "application/json";
HttpContext.Current.Response.Write(ObjdBAccess.Get(Columns, Tbl));
HttpContext.Current.Response.End();
}
Или вы можете работать с атрибутом ScriptMethod.
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public static string GetAll(string Columns, string Tbl)
{
return ObjdBAccess.Get(Columns, Tbl);
}
Для десериализации ответа JSON, поскольку это объект, а не массив:
using Newtonsoft.Json.Linq;
JObject jObj = JObject.Parse(userJson2);
DataTable DT = jObj["Table"].ToObject<DataTable>();
Используйте ContentType вместо ResponseType. Для второго подхода убедитесь, что вы используете тип возврата use string.
Тип контента в порядке. Во-вторых, я изменил веб-метод на «публичную строку GetAll(string Columns, string Tbl)» вместо static void и добавил «return HttpContext.Current.Response.ToString();» этому методу. Новая ошибка вроде этой: неожиданный токен JSON при чтении DataTable. Ожидал StartArray, получил StartObject. Путь '', строка 1, позиция 1.' Это новый userJson2: {"Table":[{"Main_Code":51,"Property_Name":"Sell","Sub_Code":"1"},{"Main_Code":52,"Property_Name":" Sell2","Sub_Code":"2"}]}
Привет, извините, еще раз обновил ответ.
Все верно, кроме последней строки: DataTable DT = JsonConvert.DeserializeObject<DataTable>(jObj["Table"]); Т.к. не могу конвертировать из Newtonsoft.Json.Linq.JToken в String А вот с этой строкой все ок DataTable DT = jObj["Table"].ToObject<DataTable>(); Большое спасибо за вашу хорошую помощь.
Спасибо за Ваш ответ. Но это не работает, потому что: 1. HttpContext.Current.Response не имеет метода расширения типа ответа. 2. В staticvoid невозможно подключиться к ObjdBAccess.