Come posso restituire un JSON pulito da un servizio WCF?

Sto cercando di restituire alcuni JSON da un servizio WCF. Questo servizio restituisce semplicemente alcuni contenuti dal mio database. Posso ottenere i dati. Tuttavia, sono preoccupato per il formato del mio JSON. Attualmente, il JSON che viene restituito è formattato in questo modo:

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

In realtà, vorrei che il mio JSON fosse formattato nel modo più pulito ansible. Credo (potrei essere errato), che la stessa collezione di risultati, rappresentata in JSON pulito, dovrebbe assomigliare così:

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

Non ho idea da dove provenga la “d”. Inoltre non ho idea del motivo per cui i caratteri di escape vengono inseriti. La mia quadro ha il seguente aspetto:

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

Il servizio responsabile della restituzione del contenuto è definito come:

 [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class TestService { [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Json)] public string GetResults() { List results = new List(); 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; } } 

Come posso restituire un JSON “pulito” da un servizio WCF? Grazie!

Cambia il tipo di ritorno dei tuoi GetResults come List .
Elimina il codice che usi per serializzare l’elenco su una stringa json – WCF lo fa automaticamente.

Usando la tua definizione per la class Person, questo codice funziona per me:

 public List GetPlayers() { List players = new List(); 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; } 

i risultati:

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

(Tutto su una riga)

Ho anche usato questo attributo sul metodo:

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

WebInvoke con Method = “GET” è lo stesso di WebGet, ma dal momento che alcuni dei miei metodi sono POST, uso tutti i WebInvoke per coerenza.

UriTemplate imposta l’URL a cui è disponibile il metodo. Quindi posso fare un GET su http://myserver/myvdir/JsonService.svc/players e funziona.

Controllare anche IIRF o un altro rewriter URL per sbarazzarsi di .svc nell’URI.

Se vuoi un bel json senza attributi hardcoding nelle tue classi di servizio,

usa nella tua configurazione di comportamento

Questo è realizzato in web.config per il tuo webservice. Imposta il bindingBehavior su e vedrai il JSON pulito. L’extra “[d]” è impostato dal comportamento predefinito che è necessario sovrascrivere.

Vedi inoltre questo blogpost: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endpoint-from-wcf.html

Ho affrontato lo stesso problema e l’ho risolto cambiando il valore attributo BodyStyle a “WebMessageBodyStyle.Bare”:

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

L’object restituito non verrà più incartato.

Quando si utilizza il metodo GET, il contratto deve essere questo.

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

con questo abbiamo un json senza il parametro di avvio

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

Nel tuo IServece.cs aggiungi il seguente tag: BodyStyle = WebMessageBodyStyle.Bare

  [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Getperson/{id}")] List Getperson(string id);