Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# JSON Serialization of Dictionary into {key:value, ...} instead of {key:key, value:value, ...}

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"       }    } 
like image 291
Aaaaaaaa Avatar asked Feb 01 '11 09:02

Aaaaaaaa


1 Answers

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

like image 69
James Newton-King Avatar answered Oct 04 '22 20:10

James Newton-King