Как вернуть объект 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. Вот почему строка возвращается вместо