我正在尝试编写一个自定义的JavascriptConverter,用于我正在编写的WebService.我必须编写一个自定义转换器,因为Microsoft.JScript.JSObject不支持IDictionary,所以它被视为一个数组.我有这部分工作正常.但是,因为Microsoft.JScript.ArrayObject是Microsoft.JScript.JSObject的子类,所以它也尝试使用相同的方法转换它.如何返回将被序列化为JSON数组的内容?我必须返回一个IDictionary,它将成为一个JSON对象.有什么我想念的吗?
具体来说,我如何从Serialize返回一些被序列化为Array的东西,而不是Object.
谢谢!
编辑:
我想我需要更具体一点.
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;
}
Run Code Online (Sandbox Code Playgroud)