#asp.net-mvc #api
#asp.net-mvc #API
Вопрос:
У меня есть хранимая процедура, которая может возвращать более одного значения поля.
Мне нужно создать API
, который получит все значения одного и того же поля.
Мой контроллер имеет следующий код:
public partial class get_active_call_info_id_Result
{
public int call_info_id { get; set; }
}
public partial class error_message
{
public int StatusCode { get; set; }
}
[BasicAuthentication]
[Route("getactivecallinfoid")]
[HttpPost, ActionName("getactivecallinfoid")]
public System.Web.Http.Results.JsonResult<String> GetACII(String u_id)
{
//var data = (dynamic)null;
using (EMSMVCEntities entities = new EMSMVCEntities())
{
String jsonResult = null;
String jsonResult_log = null;
entities.Configuration.ProxyCreationEnabled = false;
var query = entities.Database.SqlQuery<get_active_call_info_id_Result>("exec [dbo].[get_active_call_info_id] @user_id", new SqlParameter("user_id", u_id))
.Select(x => new
{
x.call_info_id,
StatusCode = 1 //Success StatusCode
}).ToList();
bool isEmpty = !query.Any();
if (isEmpty)
{
error_message error_status = new error_message()
{
StatusCode = 0
};
jsonResult = JsonConvert.SerializeObject(error_status);
}
else
{
jsonResult = JsonConvert.SerializeObject(query[0]); // <-- using Newtonsoft.Json
}
return Json(jsonResult);
}
}
Результат, который я получаю, вызывая этот API через POSTMAN
, таков:
"{"call_info_id":3,"StatusCode":1}"
Правильный должен быть чем-то вроде:
"{"call_info_id":3, "call_info_id":4,"StatusCode":1}"
Комментарии:
1. вы сериализуете только первый элемент в массиве — вместо запроса [0] просто сериализуйте запрос, и в итоге вы должны получить что-то вроде
"[{"call_info_id":3}, {"call_info_id":4}] ,"StatusCode":1}"
2. @Carl Не могли бы вы также рассказать мне, пожалуйста, как убрать квадратные скобки в этом?
3. Квадратные скобки обозначают список объектов, это синтаксис JSON. если вам нужен плоский объект, создайте класс с несколькими свойствами, например callinfoId1, callinfoId2 и т.д., И сериализуйте это. но это может быть неприятно, если вы не знаете, сколько значений вы могли бы получить
Ответ №1:
Я нашел решение, используя dictionary
:
[BasicAuthentication]
[Route("getactivecallinfoid")]
[HttpPost, ActionName("getactivecallinfoid")]
public System.Web.Http.Results.JsonResult<String> GetACII(String u_id)
{
using (EMSMVCEntities entities = new EMSMVCEntities())
{
String jsonResult = null;
String jsonResult_log = null;
entities.Configuration.ProxyCreationEnabled = false;
var query_pre = entities.Database.SqlQuery<get_active_call_info_id_Result>("exec [dbo].[get_active_call_info_id] @user_id", new SqlParameter("user_id", u_id))
.ToList();
var query = new Dictionary<String, String>();
int counter = 1;
foreach (var item in query_pre)
{
query.Add("call_info_id_" counter.ToString(), item.call_info_id.ToString());
counter = counter;
};
query.Add("StatusCode","1");
bool isEmpty = !query.Any();
if (isEmpty)
{
error_message error_status = new error_message()
{
StatusCode = 0
};
jsonResult = JsonConvert.SerializeObject(error_status);
}
else
{
jsonResult = JsonConvert.SerializeObject(query); // <-- using Newtonsoft.Json
}
return Json(jsonResult);
}
}