我正在尝试编写一个自定义 JavascriptConverter 以与我正在编写的 WebService 一起使用。我必须编写一个自定义转换器,因为 Microsoft.JScript.JSObject 不支持 IDictionary,所以它被视为一个数组。我的这部分工作正常。但是,由于 Microsoft.JScript.ArrayObject 是 Microsoft.JScript.JSObject 的子类,因此它也尝试使用相同的方法对其进行转换。如何返回将被序列化为 JSON 数组的内容?我必须返回一个 IDictionary,它将成为一个 JSON 对象。有什么我想念的吗?
具体来说,我如何从 Serialize 返回一些被序列化为数组而不是对象的东西。
谢谢!
编辑:
我想我需要更具体一些。
Microsoft.JScript.JSObject 实现 IEnumerable,但不是 IDictionary。Microsoft.JScript.ArrayObject 是 Microsoft.JScript.JSObject 的子类。如果我在 JScript.NET 中创建一个 .asmx,当我尝试返回一个 JSObject 时,它会被序列化为一个数组(因为它实现了 IEnumerable,而不是 IDictionary),这意味着只有对象中的属性名称会被序列化。当然,如果我交回一个 ArrayObject,它就可以正常工作,并将其序列化为一个数组。
所以,我实现了一个JavascriptConverter的子类,它说它的SupportedType是Microsoft.JScript.JSObject。现在,JSObjects 被正确序列化了。但是,由于 ArrayObject 是 JSObject 的子类,JavascriptSerializer 不再负责序列化 ArrayObjects 本身,而是将其交给 JSObject 序列化器。问题是,我的自定义序列化程序如何返回 JavaScriptSerializer 将正确视为数组而不是对象的东西——Serialize 被迫返回一个 IDictionary,并且它被序列化为一个对象,而不是一个数组。
这个问题更有意义吗?
顺便说一句:我已经查看了 WCF 和 C#,但是 DataContractJsonSerializer 输出完全没用,除非您只使用 WCF 客户端访问它;我打算使用 jQuery 来检索它。
回答:
我终于明白了 bdukes 想说什么,而且它有效!您需要在返回字典时告诉它它是一个数组(尽管这不适用于顶级数组)。这是Serialize
我要编写的函数:
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;
}