2011-02-24 3 views
1

J'ai un service Web qui reçoit une chaîne JSON en tant que paramètre. J'ai seulement réussi à envoyer ceci quand le paramètre de ma méthode web est un 'type' de type générique.Comment puis-je sérialiser cet objet JSON?

Puis-je sérialiser cet objet générique à une chaîne ou un objet personnalisé? Dois-je modifier le type de paramètre de cette méthode? Toute aide serait géniale.

Voici la méthode web:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(object json) 
{ 
    //serialization magic 
} 

C'est le JSON de test qui est passé à cette méthode web:

{ 
    "uid":"1234abcd", 
    "application":"Application Name", 
    "eventName":null, 
    "clienttoken":"Test Client", 
    "version":"1.0.0", 
    "datetime":"1/1/2011 12:00 AM", 
    "data":[ 
     { 
      "id":"alpha_123", 
      "question":"ronunciations in pre-classical times or in non-Attic dialects. For det", 
      "answer":"nunciations " 
     }, 
     { 
     "id":"beta_456", 
     "question":"official documents such as laws an", 
     "answer":"or modif" 
     }, 
     { 
      "id":"gamma_789", 
      "question":" maintained or modified slightly to fit Greek phonology; thus, ?", 
      "answer":"iation of Attic" 
     }, 
     { 
      "id":"delta_098", 
      "question":"econstructed pronunciation of Attic in the late 5th an", 
      "answer":"unciation of " 
     }, 
     { 
      "id":"epsilon_076", 
      "question":"erent stylistic variants, with the descending tail either going straight down o", 
      "answer":"Whole bunch" 
     }, 
     { 
      "id":"zeta_054", 
      "question":"rough breathing when it begins a word. Another diacritic use", 
      "answer":"other dia" 
     } 
    ] 
} 

Répondre

2

Vous avez besoin d'une classe comme suit et l'utiliser comme le type dans votre webmethod au lieu de l'objet.

class JsonDTO 
{ 

    public JsonDTO() 
    { 
    data = new List<data>(); 
    } 
    public string uid {get; set;} 
    public string application {get;set} 
    public string eventName {get; set;} 
    public string clienttoken {get;set} 
    public string version {get;set;} 
    public string @datetime {get; set;} 
    public List<data> data {get; set;} 



} 

public class data 
{ 
    public string id {get; set;} 
    public string question {get; set;} 
    public string answer {get; set;} 
} 
+0

Il va juste travailler ?! Cool .. Je vais essayer ça. – Nick

+0

Cela me devient très proche .. mais la liste « données » ne se laisse peuplé – Nick

+0

Qu'à cela ne tienne pas .. :) Merci homme .. Je ne savais pas que asp.net serait qu'élaborer les propriétés comme ça. – Nick

2

Vous devrait être en mesure d'avoir le framework .Net correctement serialise la plupart des objets de sorte que votre signature de la méthode Web ressemble à ceci:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(MyClass input); 

Mais j'ai trouvé que certains objets qu'il a probelms avec, et donc ma méthode de repli est d'accepter une chaîne à la place (qui sera le sérialisé JSON) et deserialise moi-même soit en utilisant la classe JavaScriptSerializer ou une bibliothèque de sérialisation JSON comme Json.Net.

Voici un exemple de deserialising un objet en utilisant la JavaScriptSerializer classe où je sépare la méthode « réelle » avec une méthode d'emballage qui gère la deserialistion pour nous:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(string input) 
{ 
    var serialiser = new JavaScriptSerializer(); 
    MyClass deserialisedInput = serialiser.Deserialize<MyClass>(input); 
    return (StoreDataOutImpl deserialisedInput); 
} 

private string StoreDataOutImpl(MyClass input); 

Cela vous donne la flexibilité d'être capable de contrôler la sérialisation en utilisant JavaScriptConverters ou en utilisant une bibliothèque complètement différente (par exemple Json.Net).

Cela exigera que vous avez une classe MyClass qui est formaté correctement pour recevoir le JSON d'entrée. Si vous ne pouvez pas vous pouvez simplement obtenir le sérialiseur à la sortie d'un dictionnaire qui contiendra paires clé - valeur correspondant aux propriétés de l'objet JSON sérialisé:

var deserialisedInput = (Dictionary<string, object>)serialiser.DeserializeObject(input); 
Questions connexes