¿Es posible serializar un .Net Dictionary < Key, Value > en JSON con DataContractJsonSerializer que es del formato:C# JSON Serialización del diccionario en {key: value, ...} en lugar de {key: key, value: value, ...}
{
key0:value0,
key1:value1,
...
}
I utilizar el diccionario < K, V >, porque no hay estructura predefinida de las entradas.
Estoy interesado sólo por DataContractJsonSerializer resultado! Ya encontré un ejemplo "Surrogate", pero hay un "dato" adicional en la salida, y si el diccionario < K, String > es, el escape también es falso.
¡He encontrado la solución, qué necesidad! En primer lugar, un "diccionario" serializable clase: (Por supuesto, esta muestra funciona de una manera, pero necesita dont't deserialización)
[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 ]; }
}
}
Uso:
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();
}
}
Y el resultado:
{
"foo":"bar",
"Name":"John Doe",
"Age":32,
"Address":{
"__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test",
"Street":"30 Rockefeller Plaza",
"City":"New York City",
"State":"NY"
}
}
¿Alguna razón específica que desea limitar a 'DataContractJsonSerializer'? Cada vez que hago una comparación (que es varias veces: estoy muy "interesado" en mis serializadores) esta es la herramienta JSON menos preferida para .NET; Siempre miro JavaScriptSerializer o JSON.Net –
¿En qué contexto estás usando esto? Es decir, es una aplicación WCF, una aplicación ASP.NET u otra cosa. ¿Está utilizando el DataContractJsonSerilizer de forma tal que está llamando al WriteObject usted mismo o está haciendo algo de framework para usted? –
Lo que no está claro en su publicación es que desea que 1 objeto JSON con propiedades (y sus valores) sean los pares nombre/valor en el diccionario. O eso o algo está mal, ya que no puede ser una matriz JSON ya que no se puede tener una matriz JSON donde cada elemento de la matriz tenga diferentes nombres de propiedad. Entonces, ¿puedes tener claro el formato real que estás buscando obtener? –