50 votes

Renvoi de json brut (chaîne) dans wcf

Je veux construire mon propre JSON et que le service renvoie une chaîne, voici le code

     [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    public string GetCurrentCart()
    {
        //Code ommited
        string jsonClient = null;
        var j = new { Content = response.Content, Display=response.Display, SubTotal=response.SubTotal};
        var s = new JavaScriptSerializer();
        jsonClient = s.Serialize(j);
        return jsonClient;
    }
 

La réponse que je reçois contient les \ "utilisés pour créer" dans des chaînes en c #.

Ce qui suit est la réponse.

 "{\"Content\":\"\\r\\n\\u003cdiv\\u003e\\r\\n\\u003cinput type=\\\"hidden\\\" name=\\\"__VIEWSTATE\\\" id=\\\"__VIEWSTATE\\\" value=\\\"\/wEPDwUBMA9kFgJmD2QWAmYPZBYGAgMPFgIeBFRleHQFKFlvdSBoYXZlIG5vIGl0ZW1zIGluIHlvdXIgc2hvcHBpbmcgY2FydC5kAgUPFgIeB1Zpc2libGVoZAIHDxQrAAIPFgIfAWhkZGQYAQUMY3RsMDEkbHZDYXJ0D2dkoWijqBUJaUxmDgFrkGdWUM0mLpgQmTOe8R8hc8bZco4=\\\" \/\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\\r\\n\\u003cdiv class=\\\"block block-shoppingcart\\\"\\u003e\\r\\n    \\u003cdiv class=\\\"title\\\"\\u003e\\r\\n        \\u003cspan\\u003eShopping Cart\\u003c\/span\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"clear\\\"\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"listbox\\\"\\u003e\\r\\n        You have no items in your shopping cart.\\r\\n        \\r\\n        \\r\\n    \\u003c\/div\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\",\"Display\":\"You have no items in your shopping cart.\",\"SubTotal\":null}"
 

Les valeurs sont correctement encodées, mais le JSON lui-même n’est pas correctement formaté. Celles-ci le font sortir de wack.

Comment puis-je retourner une chaîne sans les \ 's devant les "?

117voto

Oleg Points 136406

Actuellement votre site web méthode de retour d'un String avec ResponseFormat = WebMessageFormat.Json. Il suivre pour l'encodage JSON de la chaîne. Correspond à www.json.org tous les guillemets dans la chaîne de caractères sera échappé à l'aide de la barre oblique inverse. Si vous avez actuellement le double encodage JSON.

La façon la plus simple de retourner n'importe quel type de données est de changer le type de sortie GetCurrentCart() web méthode de Stream ou Message (à partir de System.ServiceModel.Channels) au lieu de String.
Voir http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx, http://msdn.microsoft.com/en-us/library/ms789010.aspx et http://msdn.microsoft.com/en-us/library/cc681221(SV.90).aspx pour des exemples de code.

Parce que vous n'avez pas écrit dans votre question, la version de .NET vous utilisez, je vous suggère d'utiliser un universel et de la manière la plus simple:

public Stream GetCurrentCart()
{
    //Code ommited
    var j = new { Content = response.Content, Display=response.Display,
                  SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    string jsonClient = s.Serialize(j);
    WebOperationContext.Current.OutgoingResponse.ContentType =
        "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(jsonClient));
}

6voto

Ivix4u Points 65

J'ai essayé la méthode proposée par Oleg, mais a constaté que lorsque j'ai utilisé cette méthode pour une grande quantité de données null mot-clé a été ajouté à la fin de la chaîne JSON.

Exemple: pour json avec beaucoup de données {"JsonExample":"xxxxx"}null

trouvé une solution pour remédier à ce problème : http://wcf.codeplex.com/workitem/67 A écrit la fonction suivante, qui accepte un objet et le retour d'une Pure sortie Json. Donc, avant de retourner mon objet dans la méthode main je fais un appel à la méthode ci-dessous.

  public HttpResponseMessage ReturnPureJson(object responseModel)
    {
        HttpResponseMessage response = new HttpResponseMessage();

        string jsonClient = Json.Encode(responseModel);
        byte[] resultBytes = Encoding.UTF8.GetBytes(jsonClient);
        response.Content = new StreamContent(new MemoryStream(resultBytes));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

        return response;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X