2010-07-18 5 views
56

Est-ce que .NET 4 est fourni avec une classe qui sérialise/désérialise les données JSON?. NET 4 possède-t-il un sérialiseur/désérialiseur JSON intégré?

  • Je sais qu'il ya des bibliothèques 3 parties, comme JSON.NET, mais je cherche quelque chose intégré à .NET.

  • J'ai trouvé Data Contracts sur MSDN, mais c'est pour WCF, pas pour Winforms ou WPF.

+4

JSON.Net est bien pris en charge et il semble que Microsoft l'intention de adoptez-les eux-mêmes * "Nous intégrerons JSON.NET en tant que Serializer JSON par défaut dans l'API Web lors de la sortie de l'équipe Web, ce qui sera agréable." * sur http://www.hanselman.com/blog/ OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx – Liam

+0

Soyez simplement conscient de la bibliothèque intégrée pour la ** performance ** de la sérialisation de JSon dans .Net! – Babak

+1

@Babak que voulez-vous dire attention? S'il vous plaît élaborer. –

Répondre

37

Vous pouvez utiliser la classe DataContractJsonSerializer où vous voulez, c'est juste une classe .net et n'est pas limitée à WCF. Plus d'informations sur la façon de l'utiliser here et here.

+0

Merci, MSDN dit classe DataContractJsonSerializer dans Assembly: System.Runtime.Serialization (dans System.Runtime.Serialization.dll). Cependant, VS2010 afficher l'erreur, ne peut pas trouver DataContractJsonSerializer. – Cheung

+0

@TatMing C'est parce que, IIRC, pré. Net V4, il réside dans System.ServiceModel.Web – Psytronic

+0

Trouver que ~ Il sur le problème Target Framework, voir: http://stackoverflow.com/questions/1825417/where-is-system -servicemodel-web-dll – Cheung

27

Il y a la classe JavaScriptSerializer (bien que vous aurez besoin de faire référence à l'ensemble de la classe System.Web.Extensions fonctionne parfaitement bien dans WinForms/WPF applications). Même si la classe DataContractJsonSerializer a été conçue pour WCF, elle fonctionne correctement dans les applications client.

+5

FYI: La comparaison entre JsonSerializer et JavaScriptSerializer peut être trouvée [http://stackoverflow.com/questions/9301878/whats-the-difference-between-datacontractjsonserializer-and-javascriptserialize](here). – LosManos

+0

JavaScriptSerializer est également enterré dans l'espace de noms System.Web.Script.Serialization.JavaScriptSerializer pour ceux qui le recherchent. – Brain2000

0

Utilisez cette classe générique pour sérialiser/désérialiser JSON. Vous pouvez facilement sérialisation structure de données complexes comme celui-ci:

Dictionary<string, Tuple<int, int[], bool, string>> 

à chaîne JSON, puis l'enregistrer dans un cadre d'application ou bien

public class JsonSerializer 
{ 
    public string Serialize<T>(T aObject) where T : new() 
    { 
     T serializedObj = new T(); 
     MemoryStream ms = new MemoryStream(); 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
     ser.WriteObject(ms, serializedObj); 
     byte[] json = ms.ToArray(); 
     ms.Close(); 
     return Encoding.UTF8.GetString(json, 0, json.Length); 
    } 

    public T Deserialize<T>(string aJSON) where T : new() 
    { 
     T deserializedObj = new T(); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(aJSON)); 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(aJSON.GetType()); 
     deserializedObj = (T)ser.ReadObject(ms); 
     ms.Close(); 
     return deserializedObj; 
    } 
}