Как вернуть объект Json из метода C#
Я пытаюсь исправить ASP.NET метод WebAPI, где требуется ответ Json. Однако вместо этого он возвращает строку.
первоначально это был формат XML, но я добавил эту строку в код mvc в App_StartWebApiConfig.cs для возврата Json по умолчанию.
config.Formatters.Remove(config.Formatters.XmlFormatter);
мы обновили метод c# следующим образом, чтобы использовать NewtonSoft:
public string Get()
{
string userid = UrlUtil.getParam(this, "userid", "");
string pwd = UrlUtil.getParam(this, "pwd", "");
string resp = DynAggrClientAPI.openSession(userid, pwd);
JsonSerializer ser = new JsonSerializer();
string jsonresp = JsonConvert.SerializeObject(resp);
return resp;
}
resp var возвращается как строковый тип:
"{status:"SUCCESS",data:["4eb97d2c6729df98206cf214874ac1757649839fe4e24c51d21d"]}"
и jsonresp var выглядит так:
""{status:\"SUCCESS\",data:[\"4eb97d2c6729df98206cf214874ac1757649839fe4e24c51d21d\"]}""
и в инструментах разработки F12 Chrome объект данных:
""{status:"SUCCESS",data:["4eb97d2c6729df98206cf214874ac1757649839fe4e24c51d21d"]}""
и в консоли, в результате угловой.fromJson (data) :
"{status:"SUCCESS",data:["4eb97d2c6729df98206cf214874ac1757649839fe4e24c51d21d"]}"
я был бы признателен за некоторые советы о том, как правильно вернуть объект Json, а не в любом строковом типе.
спасибо.
Боб
------------ обновление ----------------
путем перехвата resp
var, и используя предложение г-на Чу ниже, я могу успешно достичь хорошего чистого объекта Json на клиенте.
Ключ в том, что resp
должен содержит двойные кавычки вокруг обеих пар ключ-значение:
public HttpResponseMessage Get()
{
string userid = UrlUtil.getParam(this, "userid", "");
string pwd = UrlUtil.getParam(this, "pwd", "");
string resp = DynAggrClientAPI.openSession(userid, pwd);
resp = "{"status":"SUCCESS","data":["194f66366a6dee8738428bf1d730691a9babb77920ec9dfa06cf"]}"; // TEST !!!!!
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(resp, System.Text.Encoding.UTF8, "application/json");
return response;
}
в консоли Chrome ответ:
Object {status: "SUCCESS", data: Array[1]}
data: Array[1]
status: "SUCCESS"
__proto__: Object
3 ответов
resp
уже является строкой JSON, но она недопустима JSON (ключи не завернуты в кавычки ("
). Если он возвращается в angular, JavaScript JSON.метод Parse() не может десериализовать его. Однако вы можете использовать JSON.NET в десериализации его в JObject и сериализации его снова в действительный JSON и создайте свой собственный HttpResponseMessage
...
public HttpResponseMessage Get()
{
string userid = UrlUtil.getParam(this, "userid", "");
string pwd = UrlUtil.getParam(this, "pwd", "" );
string resp = DynAggrClientAPI.openSession(userid, pwd);
var jObject = JObject.Parse(resp);
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jObject.ToString(), Encoding.UTF8, "application/json");
return response;
}
или вы можете просто вернуть JObject
и веб-API сериализует его для вас...
public JObject Get()
{
string userid = UrlUtil.getParam(this, "userid", "");
string pwd = UrlUtil.getParam(this, "pwd", "" );
string resp = DynAggrClientAPI.openSession(userid, pwd);
var jObject = JObject.Parse(resp);
return jObject;
}
в любом случае Вызов Web API должен вернуть этот JSON, который теперь действителен...
{
"status": "SUCCESS",
"data": [
"4eb97d2c6729df98206cf214874ac1757649839fe4e24c51d21d"
]
}
в угловом коде вам нужно будет выкопать идентификатор сеанса, который хранится в массиве с именем data
...
userService.openUserSession(rzEnvJson).then(function (response) {
var sessionResponse = response.data; // or simply response, depending if this is a promise returned from $http
$rootScope.rgSessionVars.sessionID = sessionResponse.data[0];
});
Я не понимаю, какое это имеет отношение к AngularJS, но ваша проблема проста. Ваш объект данных закодирован в JSON. Таким образом, вы почти наверняка можете получить доступ data.JsonRequestBehavior
и будет 1
. Но ваше поле данных внутри него снова закодировано JSON. Вам нужно декодировать его, прежде чем пытаться использовать его - это просто строка, когда вы получаете этот обратный вызов:
var myData = angular.fromJson(data.Data);
console.log(myData.data);
обратите внимание, что ваши данные.Объект данных сам по себе является другой оболочкой - массивом. Вы почти наверняка хотите myData.data[0]
зайти в поле сеанса...
ключ к тому, что происходит здесь, в комментарии Майк Cheel; сериализация происходит дважды, один раз в коде OP и один раз Asp.Net WebAPI
. Вот почему строка возвращается вместо