Come posso convertire un dizionario in una stringa JSON in C #?

Voglio convertire il mio Dictionary<int,List> in stringa JSON. Qualcuno sa come ottenere questo in C #?

La serializzazione delle strutture di dati contenenti solo valori numerici o booleani è abbastanza semplice. Se non hai molto da serializzare, puoi scrivere un metodo per il tuo tipo specifico.

Per un Dictionary> come specificato, puoi usare Linq:

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

Tuttavia, se stai serializzando diverse classi o strutture di dati più complesse, o se i tuoi dati contengono valori di stringa , ti conviene utilizzare una libreria JSON affidabile che sappia già come gestire i caratteri di escape e le interruzioni di riga. Json.NET è un’opzione popolare.

Probabilmente Json.NET serializza i dizionari C # in modo adeguato ora, ma quando l’OP inizialmente ha pubblicato questa domanda, molti sviluppatori MVC potrebbero aver usato la class JavaScriptSerializer perché quella era l’opzione predefinita predefinita.

Se stai lavorando su un progetto legacy (MVC 1 o MVC 2) e non puoi utilizzare Json.NET, ti consiglio di utilizzare un List> invece di un Dictionary> . La class legacy JavaScriptSerializer serializzerà questo tipo bene, ma avrà problemi con un dizionario.

Documentazione: serializzazione delle raccolte con Json.NET

Questa risposta menziona Json.NET ma non ti dice come utilizzare Json.NET per serializzare un dizionario:

 return JsonConvert.SerializeObject( myDictionary ); 

A differenza di JavaScriptSerializer, myDictionary non deve essere un dizionario di tipo per far funzionare JsonConvert.

 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())); } } } } 

Questo scriverà sulla 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]}] 

Scusa se la syntax è la più piccola, ma il codice da cui ottengo è originariamente in VB 🙂

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

Semplice risposta a una riga

( using System.Web.Script.Serialization )

Questo codice convertirà qualsiasi Dictionary in Dictionary e quindi serializzerà come stringa JSON:

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

Vale la pena notare che qualcosa come Dictionary può anche essere serializzato in questo modo preservando il tipo / object complesso.


Spiegazione (analisi)

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

Puoi sostituire la variabile yourDictionary con la tua variabile attuale.

 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. 

Lo facciamo, perché sia ​​la chiave che il valore devono essere di tipo string, come requisito per la serializzazione di 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. 

È ansible utilizzare System.Web.Script.Serialization.JavaScriptSerializer :

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

Nell’uso di Asp.net Core:

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

È ansible utilizzare JavaScriptSerializer .

Sembra un sacco di librerie diverse e ciò che non sembra andare e venire negli anni precedenti. Tuttavia, ad aprile 2016, questa soluzione ha funzionato bene per me. Corde facilmente sostituibili con int .

TL / DR; Copia questo se è quello per cui sei venuto qui:

  //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(); } 

Due punti di importazione. Per prima cosa, assicurati di aggiungere System.Runtime.Serliazation come riferimento nel tuo progetto all’interno di Solution Explorer di Visual Studio. Secondo, aggiungi questa linea,

 using System.Runtime.Serialization.Json; 

nella parte superiore del file con il resto dei tuoi utilizzi, quindi è ansible trovare la class DataContractJsonSerializer . Questo post del blog ha più informazioni su questo metodo di serializzazione.

Formato dati (input / output)

I miei dati sono un dizionario con 3 stringhe, ciascuna delle quali punta a un elenco di stringhe. Gli elenchi di stringhe hanno lunghezza 3, 4 e 1. I dati sono simili a questo:

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

L’output scritto su file sarà su una riga, ecco l’output formattato:

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

Questo è simile a ciò che Meritt ha pubblicato in precedenza. semplicemente postando il codice 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; }