How do I return clean JSON from a WCF Service?

前端 未结 6 1022
借酒劲吻你
借酒劲吻你 2020-11-22 07:19

I am trying to return some JSON from a WCF service. This service simply returns some content from my database. I can get the data. However, I am concerned about the format

相关标签:
6条回答
  • 2020-11-22 07:47

    When you are using GET Method the contract must be this.

    [WebGet(UriTemplate = "/", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<User> Get();
    

    with this we have a json without the boot parameter

    Aldo Flores @alduar http://alduar.blogspot.com

    0 讨论(0)
  • 2020-11-22 07:51

    If you want nice json without hardcoding attributes into your service classes,

    use <webHttp defaultOutgoingResponseFormat="Json"/> in your behavior config

    0 讨论(0)
  • 2020-11-22 08:01

    This is accomplished in web.config for your webservice. Set the bindingBehavior to <webHttp> and you will see the clean JSON. The extra "[d]" is set by the default behavior which you need to overwrite.

    See in addition this blogpost: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endpoint-from-wcf.html

    0 讨论(0)
  • 2020-11-22 08:05

    I faced the same problem, and resolved it by changing the BodyStyle attribut value to "WebMessageBodyStyle.Bare" :

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetProjectWithGeocodings/{projectId}")]
    GeoCod_Project GetProjectWithGeocodings(string projectId);
    

    The returned object will no longer be wrapped.

    0 讨论(0)
  • 2020-11-22 08:06

    Change the return type of your GetResults to be List<Person>.
    Eliminate the code that you use to serialize the List to a json string - WCF does this for you automatically.

    Using your definition for the Person class, this code works for me:

    public List<Person> GetPlayers()
    {
        List<Person> players = new List<Person>();
        players.Add(new  Person { FirstName="Peyton", LastName="Manning", Age=35 } );
        players.Add(new  Person { FirstName="Drew", LastName="Brees", Age=31 } );
        players.Add(new  Person { FirstName="Brett", LastName="Favre", Age=58 } );
    
        return players;
    }
    

    results:

    [{"Age":35,"FirstName":"Peyton","LastName":"Manning"},  
     {"Age":31,"FirstName":"Drew","LastName":"Brees"},  
     {"Age":58,"FirstName":"Brett","LastName":"Favre"}]
    

    (All on one line)

    I also used this attribute on the method:

    [WebInvoke(Method = "GET",
               RequestFormat = WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "players")]
    

    WebInvoke with Method= "GET" is the same as WebGet, but since some of my methods are POST, I use all WebInvoke for consistency.

    The UriTemplate sets the URL at which the method is available. So I can do a GET on http://myserver/myvdir/JsonService.svc/players and it just works.

    Also check out IIRF or another URL rewriter to get rid of the .svc in the URI.

    0 讨论(0)
  • 2020-11-22 08:13

    In your IServece.cs add the following tag : BodyStyle = WebMessageBodyStyle.Bare

     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Getperson/{id}")]
    
        List<personClass> Getperson(string id);
    
    0 讨论(0)
提交回复
热议问题