ASP.NET JSON Web服务始终返回包含在XML中的JSON响应

时间:2009-07-13 19:27:20

标签: xml json asmx

我看到了一个类似的问题,但它没有解决我的问题。我在ASMX文件中有一个JSON Web服务;

网络方法的代码

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetUserRoles(string JSONUserCode)
        {
            string retRoles = string.Empty;
            List<JSONRole> roles = new List<JSONRole>();

            {... I Populate the roles here ...}

            DataContractJsonSerializer serializer = new
            DataContractJsonSerializer(roles.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, roles);
            string jsonString = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }

这正确地正确地格式化了List,但是用XML包装了整个返回。以下是回复:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/">
       [{"Name":"Accounts Payable"},{"Name":"Payroll"}]
    </string>

您可以点击以下链接查看自己的回复:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

我需要的答案只是:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}]

有什么想法吗?谢谢你的帮助。

9 个答案:

答案 0 :(得分:11)

WebMethod能够提供与XML和JSON相同的信息。在提交请求时,您需要在客户端中指定所需的格式(dataType)。

此外,您不应该手动将对象序列化为JSON,而是返回 roles ,如果您的客户端以JSON格式请求数据,它将被序列化为JSON。

修改

jQuery示例(请注意dataType参数):

$.ajax({
   type: 'GET',
   url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles',
   contentType: 'application/json; charset=utf-8',
   dataType: 'json',
   data: '{"JSONUserCode":"1234"}',
   success: myCallback
});

值得一提的是,对象不会以您指定的格式返回,而是包装在对象中:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }

然而,这实际上非常可取,for added security

答案 1 :(得分:3)

原来这不是dataType,而是

contentType: 'application/json; charset=utf-8'.  

它就像一个魅力。

答案 2 :(得分:1)

确保您的服务类具有[ScriptService]属性。默认情况下不会添加此属性。

答案 3 :(得分:1)

尝试使用Jayrock for .NET,它是.NET JSON RPC的简洁处理程序。它会完全满足您的需求。 ASP .NET JSON RPC here有一步一步的操作方法。

答案 4 :(得分:1)

我自己处理序列化也犯了同样的错误。你不应该返回字符串而是返回对象本身。

如果您已经开发了这样的一百个服务,请为您解决:只需创建一个aspx,ServiceCaller.aspx,删除html中的所有内容,只需保留页面指令并使用codebehind来调用服务和响应。写字符串。同时将Service方法名称作为“HelloWorld”之类的参数,并使用反射来调用它。

它有点用你的右手显示你的左耳,但它有效。您还可以轻松集成角色管理和使用反射获取服务名称作为字符串检查数据库,如果用户可以调用此服务并使用反射调用该方法。

(欢迎任何评论:)

答案 5 :(得分:1)

像这样使用不返回字符串类型。只需写

public void Metod()
    {
        json = jss.Serialize(Data);
        Context.Response.Write(json);
    }

答案 6 :(得分:0)

我们创建了另一个调用服务服务器端并写入响应的页面(在我们的例子中是.aspx)。我们清理了所有HTML代码,doctype head body,并使服务器端代码调用服务并响应。编写它。

(在aspx的情况下,只需将页面指令保留在顶部)

这样你就可以得到一个干净的字符串。

顺便说一下,如果这会将我们的应用程序暴露给任何安全威胁或主要性能命中,我真的很感激这些评论。 太忙了,不能在这里问它或搜索它:)

答案 7 :(得分:0)

您在方法声明中仅遗漏了“静态”关键字,请查看以下内容。

仅供参考:所有网络方法都应该是静态的

[的WebMethod]         [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

    public static string GetUserRoles(string JSONUserCode)
    {
        string retRoles = string.Empty;
        List<JSONRole> roles = new List<JSONRole>();

        {... I Populate the roles here ...}

        DataContractJsonSerializer serializer = new
        DataContractJsonSerializer(roles.GetType());
        MemoryStream ms = new MemoryStream();
        serializer.WriteObject(ms, roles);
        string jsonString = Encoding.Default.GetString(ms.ToArray());
        ms.Close();
        return jsonString;
    }

答案 8 :(得分:0)

而不是在WebMethod中使用字符串返回字符串:

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));