2010-06-10 6 views
1

J'ai un objet en Javascript qui ressemble à ceComment sérialiser/désérialiser une classe C#?

function MyObject(){ 
    this.name=""; 
    this.id=0; 
    this..... 
} 

Je stringify alors un tableau de ces objets et de l'envoyer à un service web ASP.Net.

Au service Web, je souhaite désérialiser la chaîne JSON pour pouvoir traiter facilement les données en C#. Ensuite, je veux envoyer un tableau d'objets du même type Javascript (les mêmes noms de champs et tout) au client. La chose que je ne comprends comment sérialiser dire cette classe:

class MyObject{ 
    public string Name; 
    public int ID; 
} 

afin que le JSON est le même que ci-dessus javascript objet. Et aussi comment se désérialiser dans la classe C# MyObject.

Comment le ferais-je facilement? J'utilise Netwonsoft.Json.

Existe-t-il un moyen de transformer une chaîne JSON en liste ou tableau d'un objet?

+0

Attendez, qu'est-ce que cela a à voir avec C#? –

+0

@Jesse Je suppose que génériquement c'est en rapport avec .Net en général, mais je préfère la réponse en C#. – Earlz

Répondre

4

avec json.net vous pouvez utiliser le JsonPropertyAttribute pour donner à vos propriétés sérialisés un nom personnalisé:

class MyObject{ 

    [JsonProperty(PropertyName = "name")] 
    public string Name; 

    [JsonProperty(PropertyName = "id")] 
    public int ID; 
} 

vous pouvez ensuite sérialiser votre objet dans une liste <> comme ceci:

var list = new List<MyObject>(); 
var o = new MyObject(); 
list.Add(o); 
var json = JsonConvert.SerializeObject(list); 

et deserialize:

// json would look like this "[{ "name":"", "id":0 }]" 
var list = JsonConvert.DeserializeObject<List<MyObject>>(json); 
+1

Grande réponse étant donné qu'il utilise Netwonsoft.Json. – Patrick

-1

Vous pouvez essayer le DataContractJsonSerializer Rick Strahl A un assez bon exemple.

Vous indiquez au sérialiseur le type auquel vous souhaitez sérialiser et vous pouvez décorer les propriétés de classe en leur disant d'attendre un autre nom.

À titre d'exemple:

class MyObject{ 
    [DataMember(name="name")] 
    public string Name; 
    [DataMember(name="id")] 
    public int ID; 
} 

EDIT: Utilisez

using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString))) 
{ 
    ser = new DataContractJsonSerializer(typeof(MyObject)); 
    MyObject obj = ser.ReadObject(ms) as MyObject; 

    int myObjID = obj.ID; 
    string myObjName = obj.Name; 
} 
0

Une chose que le WebMethod vous donne est de retour d'une enveloppe « d » que je battais avec pendant des heures pour se déplacer. Ma solution avec la bibliothèque Newtonsoft/JSON.NET est ci-dessous. Il pourrait y avoir un moyen plus facile de faire cela que j'aimerais savoir.

public class JsonContainer 
{ 
    public object d { get; set; } 
} 

public T Deserialize<T>(string json) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 

    JsonContainer container = (JsonContainer)serializer.Deserialize(new StringReader(json), typeof(JsonContainer)); 
    json = container.d.ToString(); 

    return (T)serializer.Deserialize(new StringReader(json), typeof(T)); 
} 
Questions connexes