with servicio paso net example crear con wcf json

servicio - wcf rest get with json request object



¿Cómo devuelvo JSON limpio desde un servicio WCF? (6)

Estoy tratando de devolver algunos JSON de un servicio WCF. Este servicio simplemente devuelve algo de contenido de mi base de datos. Puedo obtener los datos. Sin embargo, me preocupa el formato de mi JSON. Actualmente, el JSON que se devuelve está formateado así:

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

En realidad, me gustaría que mi JSON se formatee de la forma más limpia posible. Creo (puedo ser incorrecto), que la misma colección de resultados, representada en JSON limpio, debería tener este aspecto:

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

No tengo idea de dónde viene la "d". Tampoco tengo idea de por qué se insertan los caracteres de escape. Mi entidad se parece a la siguiente:

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

El servicio que es responsable de devolver el contenido se define como:

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

¿Cómo devuelvo JSON “limpio” desde un servicio WCF? ¡Gracias!


Cambie el tipo de retorno de sus GetResults a List<Person> .
Elimine el código que utiliza para serializar la Lista a una cadena json; WCF lo hace automáticamente.

Usando tu definición para la clase Persona, este código funciona para mí:

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

resultados:

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

(Todo en una línea)

También utilicé este atributo en el método:

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

WebInvoke with Method = "GET" es lo mismo que WebGet, pero dado que algunos de mis métodos son POST, utilizo todos WebInvoke para mantener la coherencia.

UriTemplate establece la URL en la que está disponible el método. Así que puedo hacer un GET en http://myserver/myvdir/JsonService.svc/players y simplemente funciona.

También puedes ver IIRF u otro reescritor de URL para deshacerte de .svc en el URI.


Cuando está utilizando el método GET, el contrato debe ser este.

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

Con esto tenemos un json sin el parámetro de arranque.

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


En su IServece.cs agregue la siguiente etiqueta: BodyStyle = WebMessageBodyStyle.Bare

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



Me enfrenté al mismo problema y lo resolví cambiando el valor de atributo BodyStyle a "WebMessageBodyStyle.Bare":

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

El objeto devuelto ya no será envuelto.


Si desea un bonito json sin atributos de codificación en sus clases de servicio,

use <webHttp defaultOutgoingResponseFormat="Json"/> en su configuración de comportamiento