c# json serialization dictionary json.net

c# - No puede Serializar diccionario con clave compleja usando Json.net



serialization dictionary (2)

Los estados de la Guía de serialización (ver sección: Diccionarios y Hashtables; gracias a @Shashwat por el enlace):

Cuando se serializa un diccionario, las claves del diccionario se convierten en cadenas y se utilizan como nombres de propiedad del objeto JSON. La cadena escrita para una clave se puede personalizar ya sea anulando ToString () para el tipo de clave o implementando un TypeConverter. Un TypeConverter también admitirá la conversión de una cadena personalizada nuevamente cuando deserialice un diccionario.

Encontré un ejemplo útil de cómo implementar un convertidor de tipo de este tipo en la página "Cómo hacer" de Microsoft:

Esencialmente, necesitaba extender System.ComponentModel.TypeConverter y anular:

bool CanConvertFrom(ITypeDescriptorContext context, Type source); object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value); object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType);

También fue necesario agregar el atributo [TypeConverter(typeof(MyClassConverter))] a la declaración de la clase MyClass .

Con estos en su lugar, pude serializar y deserializar los diccionarios automáticamente .

Tengo un diccionario con un tipo de .net personalizado como su clave. Estoy intentando serializar este diccionario a JSON usando JSON.net, sin embargo, no puede convertir las claves al valor adecuado durante la serialización.

class ListBaseClass { public String testA; public String testB; } ----- var details = new Dictionary<ListBaseClass, string>(); details.Add(new ListBaseClass { testA = "Hello", testB = "World" }, "Normal"); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<ListBaseClass, string>> results);

Esto me da -> "{/ JSonSerialization.ListBaseClass /": / "Normal /"} "

Sin embargo, si tengo mi tipo personalizado como valor en el diccionario, funciona bien

var details = new Dictionary<string, ListBaseClass>(); details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, ListBaseClass>>(results);

Esto me da -> "{/" Normal / ": {/" testA / ": /" Hello / ", /" testB / ": /" World / "}}"

Alguien puede sugerir si estoy golpeando alguna limitación de Json.net o estoy haciendo algo mal?


Todo es mas facil

var details = new Dictionary<string, ListBaseClass>(); details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details.ToList()); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<ListBaseClass, string>> results);

Muestra

class Program { static void Main(string[] args) { var testDictionary = new Dictionary<TestKey,TestValue>() { { new TestKey() { TestKey1 = "1", TestKey2 = "2", TestKey5 = 5 }, new TestValue() { TestValue1 = "Value", TestValue5 = 96 } } }; var json = JsonConvert.SerializeObject(testDictionary); Console.WriteLine("=== Dictionary<TestKey,TestValue> =="); Console.WriteLine(json); // result: {"ConsoleApp2.TestKey":{"TestValue1":"Value","TestValue5":96}} json = JsonConvert.SerializeObject(testDictionary.ToList()); Console.WriteLine("=== List<KeyValuePair<TestKey, TestValue>> =="); Console.WriteLine(json); // result: [{"Key":{"TestKey1":"1","TestKey2":"2","TestKey5":5},"Value":{"TestValue1":"Value","TestValue5":96}}] Console.ReadLine(); } } class TestKey { public string TestKey1 { get; set; } public string TestKey2 { get; set; } public int TestKey5 { get; set; } } class TestValue { public string TestValue1 { get; set; } public int TestValue5 { get; set; } }