237 votes

Comment retourner un fichier JSON propre à partir d'un service WCF?

Je suis en train de revenir à l'JSON à partir d'un service WCF. Ce service renvoie simplement un peu de contenu à partir de ma base de données. Je peux obtenir les données. Cependant, je suis préoccupé par le format de mon JSON. Actuellement, le JSON qui revient est formaté comme ceci:

{"d":"[{\"Age\":35,\"FirstName\":\"Peyton\",\"LastName\":\"Manning\"},{\"Age\":31,\"FirstName\":\"Drew\",\"LastName\":\"Brees\"},{\"Age\":29,\"FirstName\":\"Tony\",\"LastName\":\"Romo\"}]"} 

En réalité, je voudrais que mon JSON être formaté aussi proprement que possible. Je crois (j'ai peut-être incorrect), que le même ensemble de résultats, représentés en propre JSON, devrait ressemble à:

[{"Age":35,"FirstName":"Peyton","LastName":"Manning"},{"Age":31,"FirstName":"Drew","LastName":"Brees"},{"Age":29,"FirstName":"Tony","LastName":"Romo"}]

Je n'ai aucune idée de l'endroit où le "d" est à venir. Je n'ai aucune idée pourquoi les caractères d'échappement sont insérées. Mon entité se présente comme suit:

[DataContract]
public class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }

    [DataMember]
    public int Age { get; set; }

    public Person(string firstName, string lastName, int age)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Age = age;
    }
}

Le service est tenu de retourner le contenu est défini comme:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string GetResults()
    {
        List<Person> results = new List<Person>();
        results.Add(new Person("Peyton", "Manning", 35));
        results.Add(new Person("Drew", "Brees", 31));
        results.Add(new Person("Tony", "Romo", 29));

        // Serialize the results as JSON
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(results.GetType());
        MemoryStream memoryStream = new MemoryStream();
        serializer.WriteObject(memoryStream, results);

        // Return the results serialized as JSON
        string json = Encoding.Default.GetString(memoryStream.ToArray());
        return json;
    }
}

Comment puis-je retourner "propre" JSON à partir d'un service WCF? Merci!!!!

216voto

Cheeso Points 87022

Modifier le type de retour de votre GetResults être List<Person>.
Éliminer le code que vous utilisez pour sérialiser la Liste à une chaîne json - WCF fait cela pour vous automatiquement.

À l'aide de votre définition de la classe Personne, ce code fonctionne pour moi:

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;
}

résultats:

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

(Sur une seule ligne)

J'ai aussi utilisé cet attribut sur la méthode:

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

WebInvoke avec method= "GET" est le même que WebGet, mais comme certaines de mes méthodes sont POST, je l'utilise tous les WebInvoke pour des raisons de cohérence.

Le UriTemplate définit l'URL à laquelle la méthode est disponible. Donc, je peux faire un GET sur http://myserver/myvdir/JsonService.svc/players et il fonctionne, tout simplement.

Consultez également IIRF ou à une autre URL rewriter pour se débarrasser de l' .svc dans l'URI.

94voto

JeremyWeir Points 9424

Si vous voulez un joli json sans attributs de codage en dur dans vos classes de service,

utilisez <webHttp defaultOutgoingResponseFormat="Json"/> dans votre configuration de comportement

28voto

user517301 Points 251

Ceci est accompli dans web.config pour votre webservice. Définissez le bindingBehavior à <webHttp> et vous verrez le JSON propre. Le "[d]" supplémentaire est défini par le comportement par défaut que vous devez remplacer.

Voir aussi ce blog: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endpoint-from-wcf.html

2voto

alduar Points 11

Lorsque vous utilisez la méthode GET le contrat doit être cela.

avec cela, nous avons un json sans le paramètre d’amorçage

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

-5voto

chitranjna Points 1
<pre><code></code><p>Utilisez ce lien pour obtenir toutes les informations étape par étape pour créer le service de wcf restful</p><p><a href="http://dotnetnukes.blogspot.in/2013/04/create-restful-wcf-service-api-using.html" rel="nofollow">http://dotnetnukes.blogspot.in/2013/04/Create-RESTful-WCF-Service-API-using.html</a></p></pre>

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