Ich versuche, JSON von einem WCF-Dienst zurückzugeben. Dieser Dienst gibt einfach einige Inhalte aus meiner Datenbank zurück. Ich kann die Daten bekommen. Ich bin jedoch besorgt über das Format meines JSON. Derzeit ist der zurückgegebene JSON wie folgt formatiert:
{"d":"[{\"Age\":35,\"FirstName\":\"Peyton\",\"LastName\":\"Manning\"},{\"Age\":31,\"FirstName\":\"Drew\",\"LastName\":\"Brees\"},{\"Age\":29,\"FirstName\":\"Tony\",\"LastName\":\"Romo\"}]"}
In Wirklichkeit möchte ich, dass mein JSON so sauber wie möglich formatiert wird. Ich glaube (ich kann mich irren), dass dieselbe Sammlung von Ergebnissen, die in sauberem JSON dargestellt wird, so aussehen sollte:
[{
"Age": 35,
"FirstName": "Peyton",
"LastName": "Manning"
}, {
"Age": 31,
"FirstName": "Drew",
"LastName": "Brees"
}, {
"Age": 29,
"FirstName": "Tony",
"LastName": "Romo"
}]
Ich habe keine Ahnung, woher das "d" kommt. Ich habe auch keine Ahnung, warum die Escape-Zeichen eingefügt werden. Meine Entität sieht wie folgt aus:
[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;
}
}
Der Dienst, der für die Rücksendung des Inhalts verantwortlich ist, ist definiert als:
[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;
}
}
Wie kann ich "sauberes" JSON von einem WCF-Dienst zurückgeben? Danke dir!
Antworten:
Ändern Sie den Rückgabetyp Ihrer GetResults in
List<Person>
.Beseitigen Sie den Code, mit dem Sie die Liste in eine JSON-Zeichenfolge serialisieren - WCF erledigt dies automatisch für Sie.
Unter Verwendung Ihrer Definition für die Person-Klasse funktioniert dieser Code für mich:
Ergebnisse:
(Alles in einer Zeile)
Ich habe dieses Attribut auch für die Methode verwendet:
WebInvoke mit Method = "GET" ist dasselbe wie WebGet, aber da einige meiner Methoden POST sind, verwende ich alle WebInvoke aus Gründen der Konsistenz.
Das UriTemplate legt die URL fest, unter der die Methode verfügbar ist. Also kann ich ein GET machen
http://myserver/myvdir/JsonService.svc/players
und es funktioniert einfach.Schauen Sie sich auch IIRF oder einen anderen URL-Umschreiber an, um die .svc in der URI zu entfernen.
quelle
Wenn Sie einen netten JSON ohne Hardcodierung von Attributen in Ihre Serviceklassen wünschen,
Verwenden Sie
<webHttp defaultOutgoingResponseFormat="Json"/>
in Ihrer Verhaltenskonfigurationquelle
Dies wird in web.config für Ihren Webservice durchgeführt. Setzen Sie das BindingBehavior auf <webHttp> und Sie sehen den sauberen JSON. Das zusätzliche "[d]" wird durch das Standardverhalten festgelegt, das Sie überschreiben müssen.
Siehe außerdem diesen Blogpost: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endpoint-from-wcf.html
quelle
Ich hatte das gleiche Problem und löste es, indem ich den BodyStyle-Attributwert in "WebMessageBodyStyle.Bare" änderte:
Das zurückgegebene Objekt wird nicht mehr verpackt.
quelle
Wenn Sie die GET-Methode verwenden, muss dies der Vertrag sein.
Damit haben wir einen JSON ohne den Boot-Parameter
Aldo Flores @alduar http://alduar.blogspot.com
quelle
Fügen Sie in Ihrer IServece.cs das folgende Tag hinzu: BodyStyle = WebMessageBodyStyle.Bare
quelle