2013-03-13 7 views
5

Ich habe wenige Klassen (Datenverträge und Serviceverträge) in WCF geschrieben und ich versuche, in JSON zu serialisieren und zu deserialisieren. Wenn ich die folgende JSON Struktur benötigen, wie würde ich schaffen die Datacontract (e):WCF - Wie serialisiert und deserialisiert man in JSON?

{ 
    "response": { 
    "locations": { 
     "location": [ 
     { 
      "id": "12", 
      "name": "Hello", 
      "statusid": "78" 
     }, 
     { 
      "id": "5", 
      "name": "Ann", 
      "statusid": "8" 
     } 
     ] 
    }, 
    "error": "404 error" 
    } 
} 

Die Struktur oben ziemlich geradlinig ist und unter Standorten kann es mehrere Ortsangaben werden wie oben erwähnt. Also muss ich ein Array/eine Liste zu "Standorten" Daten Mitgliedern wie unten erwähnt bekommen. Im Moment habe ich nur folgenden DataContract:

[DataContract] 
    public class Response 
    { 
     [DataMember] 
     public string locations { get; set; } 

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

Bitte lassen Sie mich wissen, wie ich das lösen kann?

Antwort

3

Besuchen Sie http://json.codeplex.com/. Verwenden Sie

JsonConvert.SerializeObject() 

, um Ihr Objekt in eine JSON-Zeichenfolge umzuwandeln. Verwenden Sie

JsonConvert.PopulateObject 

, um JSON-Zeichenfolge in ein Objekt zu verwandeln.

[DataContract(Name="response")] 
public class Response 
{ 
    [DataMember(Name = "locations")] 
    public IEnumerable<Location> Locations { get; set; } 

    [DataMember(Name = "error")] 
    public string Error { get; set; } 
} 

[DataContract(Name = "location")] 
public class Location 
{ 
    [DataMember(Name = "id")] 
    public string Id { get; set; } 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "statusid")] 
    public string StatusId { get; set; } 
} 

Sie einrichten müssen die Objekthierarchie, wie sie in den { und } sowie die IEnumerable/Array-Eigenschaften angegeben, wie angegeben:

10

die vollen Objekte Sie suchen, sollte so strukturiert sein, durch die [ und von Ihrem gewünschten JSON-Ausgang.

Die Website kann verwirrend sein, da es keine einfachen Beispiele gibt, aber bitte lesen Sie Introducing JSON für ein grundlegendes Verständnis der Syntax. Eine andere gute Seite, die ich mit nur ein paar einfachen Beispielen mitbrachte, war JSON and XML Serialization in ASP.NET Web API.

Dank einiger Führung von Vittore, bemerkte ich, dass die genaue Anpassung an Ihre JSON Ausgabe zu bauen, müssen Sie Objekte wie:

[DataContract] 
public class ResponseParent 
{ 
    [DataMember(Name = "response")] 
    public Response ResponseInstance { get; set; } 
} 

[DataContract] 
public class Response 
{ 
    [DataMember(Name = "locations")] 
    public LocationCollectionIntermediate Locations { get; set; } 

    [DataMember(Name = "error")] 
    public string Error { get; set; } 
} 

[DataContract] 
public class LocationCollectionIntermediate 
{ 
    [DataMember(Name = "location")] 
    public IEnumerable<Location> Locations { get; set; } 
} 

[DataContract] 
public class Location 
{ 
    [DataMember(Name = "id")] 
    public string Id { get; set; } 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "statusid")] 
    public string StatusId { get; set; } 
} 

Ich habe diese in einem zweiten Codeblock hier hinzugefügt, weil Eine solche Struktur erscheint unnötig kompliziert. Wenn Sie sich jedoch in einer Position befinden, in der Sie die erwartete Ausgabe Ihres JSON ändern können, würde ich mit dem ersten Block fortfahren, mit der zusätzlichen Änderung der beiden Id-Spalten in int-Typen.

wurden Diese Arten erstellt bei WCF Service to return JSON, einen Dienst ähnlich wie als Einrichtung zu unterstützen und getestet, mit dem folgenden Code:

string json; 
using (var ms = new MemoryStream()) 
{ 
    var ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(ResponseParent)); 
    ser.WriteObject(ms, r); 
    json = System.Text.Encoding.UTF8.GetString(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length)); 
} 

Details zu DataContractJsonSerializer

Beachten Sie auch, dass, wenn Sie die Option Setup ein REST-fähiger Web-Service, dann können Sie den Richtlinien von How to create a JSON WCF RESTful Service in 60 seconds folgen.

+1

Ich würde lieber nennen Klassen und Eigenschaften in geeigneter Weise nach C# codding Standards (dh Ort nicht Standort) und verwenden Hinweise in Datamember etc Attribute dh '[Datamember (Name = "location")] public class Location' – vittore

+0

Eine andere Sache, die ich gerade bemerkt habe, dass entweder der Themenstarter einen Fehler in der Beispiel-Json-Payload hat, oder Sie müssen eine andere Klasse einführen, da er das Objekt 'locations' mit der Eigenschaft' location' hat Das ist Array von etwas (scheinbar von dem, was Sie 'location' Objekt in Ihrem C# Snippet genannt) – vittore

+0

Vielen Dank für die Hilfe. Mike, basierend auf welcher Serialisierungsmethode haben Sie die oben genannten Strukturen implementiert? Die .Net-Serialisierung oder JSON.NET? Weil ich mich gefragt habe, ob es mit nativer Serialisierung gemacht werden kann. –

3

Sobald Sie die genaue, attributierte Struktur haben, können Sie auch die JavaScriptSerializer Klasse von System.Web.Script.Serialization (seit .NET 3.5)

So etwas wie dies funktioniert:

string jsonString; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
Response responseObject = serializer.Deserialize<Response>(jsonString); 

Noch einfacher als DataContractSerializer mit, obwohl ich über seine Einsprüche nicht ganz sicher bin. Ich habe es mehrmals ohne Probleme benutzt.

Sie können auch benutzerdefinierte JavaScriptConverter s hinzufügen, was es ermöglicht, a nicer way of dynamic JSON parsing relativ einfach zu implementieren.

Dynamische Analyse ist auch sehr einfach auf diese Weise:

string jsonString; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic responseObject = serializer.Deserialize<object>(jsonString); 

responseObject["locations"] = ...