将特定的.net对象公开为JSON

时间:2009-01-16 18:16:12

标签: .net web-services json

我目前正在使用ScriptService属性为我的Web服务启用JSON调用。问题是我的一个类引用了第二个类,而.Net没有拿起并写出第二个类的JavaScript。

作为一种解决方法,我可以编写一个只返回第二个类的虚方法。然后.Net写入JSON以允许它被序列化。所以在下面的例子中:

[ScriptService]
public class MyService : WebService {
    [WebMethod]
    public void SaveClass1(Class1 class1) {
        ...
    }
}

[Serializable]
public class Class1 {
    public Class2 class2 { get; set; }
}

[Serializable]
public class Class2 {
}

MyService.asmx / js不会编写代码以允许我实例化Class2以便我填充Class1。但是如果我补充一下,我可以让它发挥作用:

[WebMethod]
public Class2 Dummy() {
    return new Class2();
}

到MyService。我非常感谢任何替代我讨厌的解决方法。

2 个答案:

答案 0 :(得分:5)

您需要使用System.Web.Script.Services.GenerateScriptTypeAttribute,它指定服务器类型应包含在生成的代理代码中。您可以将此属性应用于Web服务本身或标有WebMethodAttribute的任何方法。

例如:

[ScriptService]
[GenerateScriptType(typeof(Class2))]
public class MyService : WebService {
    [WebMethod]
    public void SaveClass1(Class1 class1) {
        // ...
    }
}

答案 1 :(得分:0)

Lee,不确定这是否适用于您的JSON / [ScriptService]方案,但要在Searcharoo.net中序列化对象图我在'base'类中使用了System.Xml.Serialization.XmlInclude属性需要序列化。

基本上这告诉XmlSerializer关于Class2,以便它可以包含在Class1序列化中...有点像用于处理对象深层次的“选择加入”策略。

你可以像这样添加它(在你的例子中):

[Serializable]
[System.Xml.Serialization.XmlInclude(typeof(Class2))]
public class Class1 {
    public Class2 class2 { get; set; }
}

...然后这个

[WebMethod]
public void SaveClass1(Class1 class1) {
    ...
}

应在Class2内返回带有Class1数据的JSON。

我做了一个快速谷歌找到troubleshooting...XmlSerializer这可能是一个很好的阅读。 HTH