【问题标题】:ASMX WebService/Serialization: How to force " __type" property to be included in javascriptASMX WebService/序列化:如何强制“__type”属性包含在 javascript 中
【发布时间】:2011-04-26 19:51:50
【问题描述】:

我正在使用 asmx webservices 并通过它们为我正在处理的 JSON 管理面板序列化/反序列化大量数据。

加载信息时,我调用一个将 User[] 数组加载到 javascript 中的 web 服务。但是,我有大约 25 个 User 子类,它们具有自己独特的属性,这些属性实际上是由这个 web 服务调用加载的。以这种方式加载它们似乎工作正常,但保存有一些问题。

save 方法需要一个 User[] 数组来保存。在大多数子类上,javascript中没有__type提示,反序列化失败。它似乎在具有 __type 属性的类上运行良好。

所以我的问题是这样的。如何强制将 __type 包含在序列化的 javascript 对象中?

这是我的 C# 调用,用于加载对象(稍微简化)以防万一您需要它:

[WebMethod(EnableSession = true)]
public User[] GetUsersInGroup(int UserGroupID)
{
    List<User> UsersInGroup = User.GetUsersInGroup(UserGroupID);
    return UsersInGroup.ToArray();
}

这是保存方法:

[WebMethod(EnableSession = true)]
public void SaveUsers(User[] Users)
{
        foreach (User CurUser in Users)
        {
            CurUser.Save();
        }
}

根据要求,服务标头:

  [ScriptService]
    public class FormFields : System.Web.Services.WebService
    {

而 JSON(简化)- 注释显示了不存在的内容:

{
    "d": [
        {
            "__type": "Tools.User.AccountingUser",  /* This is missing */
            "UserID": 3934,
            "HasQBAccess": true 
        },
        {
            "__type": "Tools.User.PowerUser",
            "UserID": 3937,
            "AccessDB": true,
            "AccessFTP": true 
        } 
    ] 
}

【问题讨论】:

  • 请显示 Web Service 类的开头。您发布的代码甚至不会返回 JSON - 只有 XML。
  • 将服务的开头附加到问题中。我曾经有一个 [ScriptMethod(ResponseFormat=ResponseFormat.Json)] 属性将其设为 JSON,但将其更改为默认 xml,希望它可以解决我的问题......它没有。但是,它的 JSON 或 XML 是否被序列化/反序列化对我来说真的没关系。
  • @ChrisG:XML 不会使用__type。它可能使用xsi:type
  • 是的,但是当它点击 javascript 时,它仍然具有 __type 作为属性,无论是 xml 还是 json。似乎.net 知道如何处理它。我的问题实际上是首先将 __type 放入 js 对象中
  • @ChrisG:请发布错误输出的示例并展示您希望它的样子。

标签: c# javascript web-services json asmx


【解决方案1】:

为了得到某种有效的答案,即使它不是一个好的答案。

到目前为止,我能找到的最佳答案是在我的 web 服务中添加一个非常长的丑陋函数定义。我永远不必调用它,只要让它坐在那里就可以让 C# 识别类型:

[WebMethod(EnableSession = true)]
public void ThisMethodSucks(AccountingUser u1, PowerUser u2, AdminUser u3, DatabaseUser u4, ADAdministratorUser u5, PSUser u6, NUTUser u7, TechUser u8, ...[all classes here])
{
      //this method never needs to get called, just sits here.
}

【讨论】:

  • 在这里接受了我自己的答案,因为已经过去了一年多,但我仍然没有找到更好的适用于 asmx webservices 的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2011-01-28
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多