Как удалить d: и __type из ответа JSON для веб-службы ASP - PullRequest
5 голосов
/ 09 декабря 2011

Я нашел несколько решений для этого в Интернете, которые предназначены для веб-службы WCF, а не для веб-службы ASP.

В настоящее время я получаю ответ в формате JSON, в котором говорится:

{"d":[{"__type":"NetworkFuzzWebSvc.Sessions","BaseUri":"http://localbox","SessionId":"43b8716f-40ab-43bf-8311-575c2ecd2730}]}

Мне нужно вернуть:

{"Sessions":["BaseUri":"http://localbox","SessionId":"43b8716f-40ab-43bf-8311-575c2ecd2730}]}

Вот копия кода веб-сервиса, который я использую (NetFuzzWebSvc.asmx):

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;

namespace NetworkFuzzWebSvc
{
    public class Sessions
    {
        public string BaseUri;
        public string SessionId;
    }

    /// <summary>
    /// Summary description for NetFuzzJson
    /// </summary>
    [WebService(Namespace = "http://localbox")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [ScriptService]
    public class NetFuzzJson : WebService
    {
        List<Sessions> Sessions = new List<Sessions>
        {
            new Sessions{
                        BaseUri = "http://localbox/", 
                        SessionId="43b8716f-40ab-43bf-8311-575c2ecd2730"
            }
        };

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public List<Sessions> GetAllSessions()
        {
            return Sessions;
        }
    }  

У кого-нибудь естьрешение этого?Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Для удаления "d" и "__type":

.svc

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    List<TestDTO> GetAll();
}

.config

<behaviors>
  <endpointBehaviors>
    <behavior name="DebugJSonBehavior" >
      <enableWebScript />
      <!--need set automaticFormatSelectionEnabled attribute -->
      <webHttp automaticFormatSelectionEnabled="true" />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="DebugJSonBehavior" >
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Js:

    $.ajax({
        type: "POST",
        url: _serviceUrl + "/TestService.svc/GetAll",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (dataret) { ... },
        error: function (xmlHttpRequest, textStatus, errorThrown) {... },
        complete: function () { ... }
    });
1 голос
/ 09 декабря 2011

Не думаю, что ты можешь.Я думаю, что это формат возвращаемого json.

Вы можете попробовать избавиться от бита ResponseFormat и вернуть строку и использовать

JavaScriptSerializer ser = new JavaScriptSerializer(); 
string json = ser.Serialize(objectClass);
return json;

Или даже лучше использовать JSON.Сетевые библиотеки.

Также посмотрите на Как не сериализовать свойство __type в объектах JSON , как удалить бит __type.

0 голосов
/ 12 октября 2012

Если вы используете ServiceStack.Text JSON Serializer , вам просто нужно:

JsConfig.ExcludeTypeInfo = true;

Эта функция автоматически добавлена ​​обратно в v2.28 но приведенный выше код не допускает этого в сериализации.Вы также можете изменить это поведение на Type с помощью:

JsConfig<Type>.ExcludeTypeInfo = true;
...