2011-02-01 30 views
48

È possibile serializzare un dizionario .Net < Chiave, Valore > in JSON con DataContractJsonSerializer che è nel formato:C# JSON Serializzazione del dizionario in {chiave: valore, ...} invece di {chiave: chiave, valore: valore, ...}

{ 
    key0:value0, 
    key1:value1, 
    ... 
} 

che utilizzo Dizionario < K, V >, perché non c'è struttura predefinita degli ingressi.

Sono interessante solo per il risultato DataContractJsonSerializer! Ho già trovato un esempio "Surrogate", ma nell'output ci sono altri "dati" e se il dizionario < K, String >, l'escape è falso.


Ho trovato la soluzione, che serve! Prima di tutto, un serializzabile "dizionario" classe: (Naturalmente, questo esempio funziona solo in un modo, ma ho bisogno di dont't deserializzazione)

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

E il risultato:

{ 
     "foo":"bar", 
     "Name":"John Doe", 
     "Age":32, 
     "Address":{ 
     "__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test", 
     "Street":"30 Rockefeller Plaza", 
     "City":"New York City", 
     "State":"NY" 
     } 
    } 
+7

Qualsiasi motivo specifico che si desidera limitare a 'DataContractJsonSerializer'? Ogni volta che ho fatto un confronto (che è più volte: sono molto "dentro" i miei serializzatori) questo è lo strumento JSON meno preferibile per .NET; Guardo sempre JavaScriptSerializer o JSON.Net –

+0

In quale contesto stai usando questo? Questa è l'app di WCF, l'app ASP.NET o qualcos'altro. Stai utilizzando DataContractJsonSerilizer in modo tale che stai chiamando WriteObject da solo o è un framework che lo fa per te? –

+0

Ciò che non è chiaro nei tuoi post è che vuoi un oggetto JSON con proprietà (e i loro valori) come coppie nome/valore nel dizionario. O questo o qualcosa non va visto che non può essere un array JSON dato che non è possibile avere un array JSON in cui ogni elemento nell'array ha nomi di proprietà differenti. Quindi, puoi essere chiaro sul formato effettivo che stai cercando di ottenere? –

risposta

4

sto usando fuori dalla scatola MVC4 con questo codice (da notare le due parametri all'interno ToDictionary)

var result = new JsonResult() 
{ 
    Data = new 
    { 
     partials = GetPartials(data.Partials).ToDictionary(x => x.Key, y=> y.Value) 
    } 
}; 

ottengo quello che ci si aspetta:

{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}} 

Importante: WebAPI in MVC4 utilizza la serializzazione JSON.NET out of the box, ma il risultato dell'azione web standard JsonResult non lo fa. Pertanto raccomando di utilizzare un ActionResult personalizzato per forzare la serializzazione JSON.NET. È inoltre possibile ottenere la formattazione bel

Ecco un semplice ActionResult JsonNetResult

http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx

Vedrete la differenza (e può fare in modo che si sta utilizzando quello giusto) durante la serializzazione una data:

Microsoft modo:

{"wireTime":"\/Date(1355627201572)\/"} 

JSON.modo NET:

{"wireTime":"2012-12-15T19:07:03.5247384-08:00"} 
35

Json.NET fa questo ...

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" 
// } 

Più esempi: Serializing Collections with Json.NET

+0

2a riga deve essere 'stringa valori = JsonConvert.SerializeObject (valori);' –

11

uso di proprietà UseSimpleDictionaryFormat su DataContractJsonSerializer e impostarlo true.

Fa il lavoro :)

+0

come è possibile impostare le impostazioni per il comportamento predefinito di wcf durante la serializzazione della risposta http? – Vinhent

+0

Ha funzionato per me, grazie! Ho dovuto usare 'config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;' in 'WebApiConfig.cs'. – SharpC

+0

Ti amo per questo uomo di risposta! Mi ha salvato! <3 – Jules

Problemi correlati