Ich versuche, einen benutzerdefinierten JavascriptConverter für die Verwendung mit einem WebService schreiben, die ich schreibe. Ich muss einen benutzerdefinierten Konverter schreiben, weil Microsoft.JScript.JSObject IDictionary nicht unterstützt, also wird es wie ein Array behandelt. Ich habe diesen Teil gut funktioniert. Da Microsoft.JScript.ArrayObject jedoch eine Unterklasse von Microsoft.JScript.JSObject ist, versucht es auch, es mit derselben Methode zu konvertieren. Wie kann ich etwas zurückgeben, das als JSON-Array serialisiert wird? Ich muss ein IDictionary zurückgeben, das ein JSON-Objekt wird. Gibt es etwas, das mir fehlt?Wie wird beim Erstellen eines JavascriptConverters ein Array zurückgegeben?
Wie kann ich etwas von Serialize zurückgeben, das als Array serialisiert wird, nicht als Objekt?
Danke!
EDIT:
Ich glaube, ich brauche mehr spezifisch.
Microsoft.JScript.JSObject implementiert IEnumerable, aber nicht IDictionary. Microsoft.JScript.ArrayObject ist eine Unterklasse von Microsoft.JScript.JSObject. Wenn ich in JScript.NET eine .asmx-Datei erstelle, wenn ich versuche, ein JSObject zurückzugeben, wird es als Array serialisiert (weil es IEnumerable, aber nicht IDictionary implementiert), was bedeutet, dass nur die Eigenschaftsnamen im Objekt serialisiert werden. Natürlich, wenn ich ein ArrayObject zurück gebe, funktioniert es richtig und serialisiert es als ein Array.
Also habe ich eine Unterklasse von JavascriptConverter implementiert, die besagt, dass es sich bei SupportedType um Microsoft.JScript.JSObject handelt. Jetzt werden JSObjects ordnungsgemäß serialisiert. Da ArrayObject jedoch eine Unterklasse von JSObject ist, kümmert sich JavaScriptSerializer nicht mehr um die Serialisierung von ArrayObjects selbst, sondern übergibt sie an den JSObject-Serializer. Die Frage ist, wie gibt mein benutzerdefinierter Serializer etwas zurück, das der JavaScriptSerializer korrekt als Array behandelt, nicht als Objekt - Serialize muss ein IDictionary zurückgeben und wird als Objekt und nicht als Array serialisiert.
Macht diese Frage mehr Sinn?
BTW: Ich habe WCF und C# stattdessen angeschaut, aber die DataContractJsonSerializer-Ausgabe ist völlig nutzlos, es sei denn, Sie werden immer nur mit einem WCF-Client darauf zugreifen; Ich plane, es mit jQuery abzurufen.
Antwort:
ich endlich verstanden, was bdukes versucht, zu sagen, und es funktioniert! Sie müssen sagen, dass es ein Array ist, wenn Sie das Wörterbuch zurückgeben (obwohl dies nicht für ein Top-Level-Array funktioniert). Hier ist die Serialize
Funktion, die ich würde auf Schreiben:
public override IDictionary<string, object> Serialize (object obj, JavaScriptSerializer serializer) {
JSObject jsobj = obj as JSObject;
Dictionary<string, object> netdict = new Dictionary<string, object>();
if (jsobj != null) {
foreach (string prop in jsobj) {
object value = jsobj.GetField(prop, BindingFlags.Default).GetValue(jsobj);
switch (value.GetType().FullName) {
case "Microsoft.JScript.ArrayObject":
object[] arr_obj = ((IEnumerable)(Microsoft.JScript.ArrayObject)value).Cast<object>().ToArray<object>();
netdict.Add(prop, arr_obj);
break;
default:
netdict.Add(prop, value);
break;
}
}
}
return netdict;
}
Was d:
diese wie folgt aufgerufen wird o Sie planen, mit einem Array zu tun, das Sie mit einem Objekt nicht tun können? –
Danke für die Klarstellung, obwohl ich denke, dass meine Antwort immer noch steht. Sie können das nicht tun, Sie müssen es zuerst in ein reguläres .NET-Array konvertieren. – bdukes