¿Cómo convierto un diccionario a una cadena JSON en C #?

Quiero convertir mi Dictionary<int,List> a una cadena JSON. ¿Alguien sabe cómo lograr esto en C #?

Serializar estructuras de datos que contienen solo valores numéricos o booleanos es bastante sencillo. Si no tiene mucho para serializar, puede escribir un método para su tipo específico.

Para un Dictionary> como usted ha especificado, puede usar Linq:

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

Pero, si está serializando varias clases diferentes, o estructuras de datos más complejas, o especialmente si sus datos contienen valores de cadena , sería mejor que utilice una biblioteca JSON acreditada que ya sepa cómo manejar cosas como caracteres de escape y saltos de línea. Json.NET es una opción popular.

Json.NET probablemente serializa diccionarios C # adecuadamente ahora, pero cuando el OP originalmente publicó esta pregunta, muchos desarrolladores de MVC pueden haber estado usando la clase JavaScriptSerializer porque esa era la opción predeterminada de fábrica.

Si está trabajando en un proyecto heredado (MVC 1 o MVC 2) y no puede usar Json.NET, le recomiendo que use un List> lugar de un Dictionary> . La clase heredada de JavaScriptSerializer serializará este tipo muy bien, pero tendrá problemas con un diccionario.

Documentación: serializar colecciones con Json.NET

Esta respuesta menciona a Json.NET, pero no llega a decirle cómo puede usar Json.NET para serializar un diccionario:

 return JsonConvert.SerializeObject( myDictionary ); 

A diferencia de JavaScriptSerializer, myDictionary no tiene que ser un diccionario de tipo para que JsonConvert funcione.

 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> foo = new Dictionary>(); foo.Add(1, new List( new int[] { 1, 2, 3, 4 })); foo.Add(2, new List(new int[] { 2, 3, 4, 1 })); foo.Add(3, new List(new int[] { 3, 4, 1, 2 })); foo.Add(4, new List(new int[] { 4, 1, 2, 3 })); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary>)); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, foo); Console.WriteLine(Encoding.Default.GetString(ms.ToArray())); } } } } 

Esto escribirá en la consola:

 [{\"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]}] 

Perdón si la syntax es mínima, pero el código del que estoy obteniendo esta originalmente en VB 🙂

 using System.Web.Script.Serialization; ... Dictionary> MyObj = new Dictionary>(); //Populate it here... string myJsonString = (new JavaScriptSerializer()).Serialize(MyObj); 

Respuesta simple de una línea

( using System.Web.Script.Serialization )

Este código convertirá cualquier Dictionary en Dictionary y luego lo serializará como una cadena JSON:

 var json = new JavaScriptSerializer().Serialize(yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString())); 

Vale la pena observar que algo así como Dictionary también se puede serializar de esta manera, mientras se conserva el tipo / objeto complejo.


Explicación (desglose)

 var yourDictionary = new Dictionary(); //This is just to represent your current Dictionary. 

Puede reemplazar la variable yourDictionary con su variable real.

 var convertedDictionary = yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()); //This converts your dictionary to have the Key and Value of type string. 

Hacemos esto, porque tanto la clave como el valor tienen que ser de tipo cadena, como un requisito para la serialización de un Dictionary .

 var json = new JavaScriptSerializer().Serialize(convertedDictionary); //You can then serialize the Dictionary, as both the Key and Value is of type string, which is required for serialization. 

Puede usar System.Web.Script.Serialization.JavaScriptSerializer :

 Dictionary dictss = new Dictionary(){ {"User", "Mr.Joshua"}, {"Pass", "4324"}, }; string jsonString = (new JavaScriptSerializer()).Serialize((object)dictss); 

En Asp.net Core use:

 using Newtonsoft.Json var obj = new { MyValue = 1 }; var json = JsonConvert.SerializeObject(obj); var obj2 = JsonConvert.DeserializeObject(json); 

Podría usar JavaScriptSerializer .

Parece que hay muchas bibliotecas diferentes y lo que parece no aparecer y desaparecer en los años anteriores. Sin embargo, a partir de abril de 2016, esta solución funcionó bien para mí. Las cadenas se reemplazan fácilmente por ints .

TL / DR; Copia esto si es para lo que viniste aquí:

  //outputfilename will be something like: "C:/MyFolder/MyFile.txt" void WriteDictionaryAsJson(Dictionary> myDict, string outputfilename) { DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Dictionary>)); MemoryStream ms = new MemoryStream(); js.WriteObject(ms, myDict); //Does the serialization. StreamWriter streamwriter = new StreamWriter(outputfilename); streamwriter.AutoFlush = true; // Without this, I've run into issues with the stream being "full"...this solves that problem. ms.Position = 0; //ms contains our data in json format, so let's start from the beginning StreamReader sr = new StreamReader(ms); //Read all of our memory streamwriter.WriteLine(sr.ReadToEnd()); // and write it out. ms.Close(); //Shutdown everything since we're done. streamwriter.Close(); sr.Close(); } 

Dos puntos de importación. Primero, asegúrese de agregar System.Runtime.Serliazation como referencia en su proyecto dentro del Explorador de soluciones de Visual Studio. En segundo lugar, agrega esta línea,

 using System.Runtime.Serialization.Json; 

en la parte superior del archivo con el rest de sus usos, por lo que se puede encontrar la clase DataContractJsonSerializer . Esta publicación de blog contiene más información sobre este método de serialización.

Formato de datos (entrada / salida)

Mis datos son un diccionario con 3 cadenas, cada una apuntando a una lista de cadenas. Las listas de cadenas tienen longitudes 3, 4 y 1. Los datos se ven así:

 StringKeyofDictionary1 => ["abc","def","ghi"] StringKeyofDictionary2 => ["String01","String02","String03","String04"] Stringkey3 => ["someString"] 

La salida escrita en el archivo estará en una línea, aquí está la salida formateada:

  [{ "Key": "StringKeyofDictionary1", "Value": ["abc", "def", "ghi"] }, { "Key": "StringKeyofDictionary2", "Value": ["String01", "String02", "String03", "String04", ] }, { "Key": "Stringkey3", "Value": ["SomeString"] }] 

Esto es similar a lo que Meritt ha publicado anteriormente. solo publicando el código completo

  string sJSON; Dictionary aa1 = new Dictionary(); aa1.Add("one", "1"); aa1.Add("two", "2"); aa1.Add("three", "3"); Console.Write("JSON form of Person object: "); sJSON = WriteFromObject(aa1); Console.WriteLine(sJSON); Dictionary aaret = new Dictionary(); aaret = ReadToObject>(sJSON); public static string WriteFromObject(object obj) { byte[] json; //Create a stream to serialize the object to. using (MemoryStream ms = new MemoryStream()) { // Serializer the object to the stream. DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType()); ser.WriteObject(ms, obj); json = ms.ToArray(); ms.Close(); } return Encoding.UTF8.GetString(json, 0, json.Length); } // Deserialize a JSON stream to object. public static T ReadToObject(string json) where T : class, new() { T deserializedObject = new T(); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) { DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedObject.GetType()); deserializedObject = ser.ReadObject(ms) as T; ms.Close(); } return deserializedObject; }