如何从 C# Web 服务返回数据表/数据集作为 JSON

Posted

技术标签:

【中文标题】如何从 C# Web 服务返回数据表/数据集作为 JSON【英文标题】:How to return datatable / dataset from c# web service as JSON 【发布时间】:2010-11-26 12:52:55 【问题描述】:

我有网络服务通过使用返回字符串作为 JSON

[网络方法] [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

并使用标头 Content-type = application/json 从客户端调用它们

这一切都很顺利,直到我需要返回一个结果表。

我已尝试使用此处的代码 http://www.west-wind.com/Weblog/posts/471835.aspx 它成功地将我的数据集编码为 JSON 并返回一个字符串,但这反过来又使用转义符进行编码,作为 .net 服务返回的一部分,这根本不是想要的。为了获得正确编码为 JSON 的数据表或数据集,我的 WebMethod 应该返回什么类型?

【问题讨论】:

【参考方案1】:

简短回答,在字符串上使用 eval,例如:var ds = eval(responseText);.

我使用 Microsoft.Web.Preview.dll 而不是 Newtonsoft。我觉得 Newtonsoft 的代码比微软多一点。它会向您发送一个字符串,而不是 JSON 对象。而在 Microsoft 中,您不需要编写所有额外的代码。下载 Microsoft.Web.Preview.dll(称为 ASP.NET Futures)。将以下内容添加到您的 web.config:

<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="33554432">
                <converters>
                    <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview"/>
                    <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview"/>
                    <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview"/>
                </converters>
            </jsonSerialization>
        </webServices>
    </scripting>
</system.web.extensions>

【讨论】:

简短的回答假设我使用 javascript 作为客户端。它实际上是一个 iPhone 应用程序。类似的东西可能会起作用,但 JSON 编码的 JSON 无论如何听起来都是个坏主意。我将尝试 ASP.NET Futures 技术,看看我能从中得到什么。 我怀疑这会起作用,但我不确定依赖 Futures 的稳定性。 我已将此标记为正确答案,因为尽管最终我选择了另一条路线,但我认为这可能最好地回答了这个问题。谢谢阿比宝贝 你应该使用 ~JSON.parse~ 而不是 eval【参考方案2】:

我通过创建一个代表我需要返回的数据的自定义类来解决这个问题,然后将服务的返回类型设置为 List 。这确实涉及一个额外的步骤来遍历数据表并构建列表,但最后我认为我更乐意返回对象列表而不是原始数据 - 无论如何这可能是一个更好的做法。

【讨论】:

以上是关于如何从 C# Web 服务返回数据表/数据集作为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

c#你如何从sqldatareader返回数据集?

如何返回具有通用属性的 C# Web 服务?

C#:从 Web 服务返回的字节 [] 在新选项卡中显示 PDF

跨数据集或子报表重用 Web 服务响应

C#显示存储过程返回的游标数据集

C#中如何把Oracle数据库查询的结果集返回