Is it possible to serialize a .Net Dictionary<Key,Value> into JSON with DataContractJsonSerializer that is of the format:
{ key0:value0, key1:value1, ... }
I use Dictionary <K,V>, because there is not predefined structure of the inputs.
I'm interesting just for DataContractJsonSerializer result! I've already found a "Surrogate" example, but there is an additional "data" in the output, and if the dictionary <K, String> is, the escaping is false too.
I've found the solution, what a needed! First of all, a serializable "dictionary" class: (Of course, this sample works just in one way, but I dont't need deserialization)
[Serializable] public class MyJsonDictionary<K, V> : ISerializable { Dictionary<K, V> dict = new Dictionary<K, V>(); public MyJsonDictionary() { } protected MyJsonDictionary( SerializationInfo info, StreamingContext context ) { throw new NotImplementedException(); } public void GetObjectData( SerializationInfo info, StreamingContext context ) { foreach( K key in dict.Keys ) { info.AddValue( key.ToString(), dict[ key ] ); } } public void Add( K key, V value ) { dict.Add( key, value ); } public V this[ K index ] { set { dict[ index ] = value; } get { return dict[ index ]; } } }
Usage:
public class MainClass { public static String Serialize( Object data ) { var serializer = new DataContractJsonSerializer( data.GetType() ); var ms = new MemoryStream(); serializer.WriteObject( ms, data ); return Encoding.UTF8.GetString( ms.ToArray() ); } public static void Main() { MyJsonDictionary<String, Object> result = new MyJsonDictionary<String, Object>(); result["foo"] = "bar"; result["Name"] = "John Doe"; result["Age"] = 32; MyJsonDictionary<String, Object> address = new MyJsonDictionary<String, Object>(); result["Address"] = address; address["Street"] = "30 Rockefeller Plaza"; address["City"] = "New York City"; address["State"] = "NY"; Console.WriteLine( Serialize( result ) ); Console.ReadLine(); } }
And the result:
{ "foo":"bar", "Name":"John Doe", "Age":32, "Address":{ "__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test", "Street":"30 Rockefeller Plaza", "City":"New York City", "State":"NY" } }
Json.NET does this...
Dictionary<string, string> values = new Dictionary<string, string>(); values.Add("key1", "value1"); values.Add("key2", "value2"); string json = JsonConvert.SerializeObject(values); // { // "key1": "value1", // "key2": "value2" // }
More examples: Serializing Collections with Json.NET
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With