Ist es möglich, ein .Net Dictionary <Schlüssel, Wert> mit DataContractJsonSerializer im folgenden Format in JSON zu serialisieren :
{
key0:value0,
key1:value1,
...
}
Ich benutze Dictionary <K, V>, weil es keine vordefinierte Struktur der Eingaben gibt.
Ich bin nur für das Ergebnis von DataContractJsonSerializer interessant ! Ich habe bereits ein "Ersatz" -Beispiel gefunden, aber es gibt zusätzliche "Daten" in der Ausgabe, und wenn das Wörterbuch <K, String> ist, ist das Escape auch falsch.
Ich habe die Lösung gefunden, was für eine Notwendigkeit! Zuallererst eine serialisierbare "Wörterbuch" -Klasse: (Natürlich funktioniert dieses Beispiel nur auf eine Weise, aber ich brauche keine Deserialisierung)
[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 ]; }
}
}
Verwendung:
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();
}
}
Und das Ergebnis:
{
"foo":"bar",
"Name":"John Doe",
"Age":32,
"Address":{
"__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test",
"Street":"30 Rockefeller Plaza",
"City":"New York City",
"State":"NY"
}
}
c#
json
serialization
dictionary
Aaaaaaaa
quelle
quelle
DataContractJsonSerializer
? Jedes Mal, wenn ich einen Vergleich durchgeführt habe (mehrmals: Ich bin sehr "in" meine Serializer verliebt), ist dies das am wenigsten bevorzugte JSON-Tool für .NET. Ich schaue immer auf JavaScriptSerializer oder JSON.NetMyJsonDictionary
richtig zu deserialisieren ?Antworten:
Json.NET macht das ...
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" // }
Weitere Beispiele: Serialisieren von Sammlungen mit Json.NET
quelle
string values = JsonConvert.SerializeObject(values);
Verwenden Sie die Eigenschaft
UseSimpleDictionaryFormat
onDataContractJsonSerializer
und setzen Sie sie auftrue
.Macht den Job :)
quelle
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
inWebApiConfig.cs
.Ich verwende sofort MVC4 mit diesem Code (beachten Sie die beiden darin enthaltenen Parameter
ToDictionary
).var result = new JsonResult() { Data = new { partials = GetPartials(data.Partials).ToDictionary(x => x.Key, y=> y.Value) } };
Ich bekomme was erwartet wird:
{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}}
Wichtig : WebAPI in MVC4 verwendet standardmäßig die JSON.NET-Serialisierung, das Standardergebnis für Webaktionen
JsonResult
jedoch nicht. Daher empfehle ich die Verwendung eines benutzerdefinierten ActionResult, um die JSON.NET-Serialisierung zu erzwingen. Sie können auch eine schöne Formatierung erhaltenHier ist ein einfaches Aktionsergebnis
JsonNetResult
http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx
Sie werden den Unterschied sehen (und können sicherstellen, dass Sie den richtigen verwenden), wenn Sie ein Datum serialisieren:
Microsoft Weg:
{"wireTime":"\/Date(1355627201572)\/"}
JSON.NET Weg:
{"wireTime":"2012-12-15T19:07:03.5247384-08:00"}
quelle
Leider ist dies derzeit in der neuesten Version von DataContractJsonSerializer nicht möglich. Siehe: http://connect.microsoft.com/VisualStudio/feedback/details/558686/datacontractjsonserializer-should-serialize-dictionary-kv-as-a-json-associative-array
Die derzeit vorgeschlagene Problemumgehung besteht darin, den JavaScriptSerializer wie oben vorgeschlagen zu verwenden.
Viel Glück!
quelle
Die MyJsonDictionary-Klasse hat für mich gut funktioniert, AUSSER, dass die resultierende Ausgabe XML-codiert ist - "0" wird also zu "0030 ". Ich stecke derzeit wie viele andere bei .NET 3.5 fest, so dass mir viele der anderen Lösungen nicht zur Verfügung stehen. "Dreht die Bilder um" und stellte fest, dass ich Microsoft niemals davon überzeugen konnte, mir das gewünschte Format zu geben, aber ...
string json = XmlConvert.DecodeName (xmlencodedJson);
TADA!
Das Ergebnis ist das, was Sie erwarten würden - regelmäßig von Menschen lesbar und nicht XML-codiert. Funktioniert in .NET 3.5.
quelle