156 votes

Comment convertir un dictionnaire en chaîne JSON en C #?

Je souhaite convertir mon Dictionary<int,List<int>> en chaîne JSON. Est-ce que quelqu'un sait comment y parvenir en C #?

146voto

Koveras Points 1169

Cette réponse mentionne Json.NET mais ne vous explique pas comment utiliser Json.NET pour sérialiser un dictionnaire:

 return JsonConvert.SerializeObject( myDictionary );
 

Contrairement à JavaScriptSerializer, myDictionary ne doit pas nécessairement être un dictionnaire de type <string, string> pour que JsonConvert fonctionne.

136voto

gilly3 Points 33285

Utiliser Linq:

 string MyDictionaryToJson(Dictionary<int, List<int>> dict)
{
    var entries = dict.Select(d =>
        string.Format("\"{0}\": [{1}]", d.Key, string.Join(",", d.Value)));
    return "{" + string.Join(",", entries) + "}";
}
 

73voto

Jim G. Points 4849

Json.NET probablement sérialise C# dictionnaires de manière adéquate maintenant, mais lorsque l'OP posté cette question, de nombreux MVC développeurs peuvent avoir été à l'aide de la JavaScriptSerializer classe parce que c'est l'option par défaut de la boîte.

Si vous travaillez sur un projet de l'héritage (MVC 1 ou MVC 2), et vous ne pouvez pas utiliser Json.NET, je vous recommande d'utiliser un List<KeyValuePair<K,V>> au lieu de Dictionary<K,V>>. L'héritage JavaScriptSerializer classe va sérialiser ce type, mais il va avoir des problèmes avec un dictionnaire.

21voto

Merritt Points 1684
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Json;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, List<int>> foo = new Dictionary<int, List<int>>();

            foo.Add(1, new List<int>( new int[] { 1, 2, 3, 4 }));
            foo.Add(2, new List<int>(new int[] { 2, 3, 4, 1 }));
            foo.Add(3, new List<int>(new int[] { 3, 4, 1, 2 }));
            foo.Add(4, new List<int>(new int[] { 4, 1, 2, 3 }));

            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<int, List<int>>));

            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, foo);
                Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
            }
        }
    }
}
 

Cela va écrire sur la console:

 [{\"Key\":1,\"Value\":[1,2,3,4]},{\"Key\":2,\"Value\":[2,3,4,1]},{\"Key\":3,\"Value\":[3,4,1,2]},{\"Key\":4,\"Value\":[4,1,2,3]}]
 

14voto

Stargazer712 Points 8764

Désolé si la syntaxe est la plus petite, mais le code dont je tire ce code était à l'origine en VB :)

 using System.Web.Script.Serialization;

...

Dictionary<int,List<int>> MyObj = new Dictionary<int,List<int>>();

//Populate it here...

string myJsonString = (new JavaScriptSerializer()).Serialize(MyObj);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X