È 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"
}
}
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 –
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? –
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? –