1

我正在调用 REST 服务 searchFavoriteCompany,该服务又调用另一个服务 A。服务 A 已经返回 JSON。但由于我的返回类型为 searchFavoriteCompany,所以我的搜索结果将返回转义字符:

"{\"responseHeader\":{\"status\":0,\"QTime\":2,\"params\":{\"facet\":\"false\",\"fl\":\"id,title,friendlyurl,avatar,locpath,objectid,objecttype\",\"indent\":\"off\",\"start\":\"0\",\"q\":\"title_search:*castle*\",\"wt\":\"json\",\"fq\":\"userid:\\\"C325D42C-A777-4275-BDD2-D7810A8AB9AB\\\"\",\"rows\":\"10\",\"defType\":\"lucene\"}},\"response\":{\"numFound\":2,\"start\":0,\"docs\":[{\"title\":\"Castle A\",\"objecttype\":1,\"friendlyurl\":\"castle-a\",\"avatar\":\"6_887_castle-a.JPG\",\"objectid\":6},{\"title\":\"Castle B\",\"objecttype\":1,\"friendlyurl\":\"castle-b\",\"avatar\":\"794_360_13j-Castle-by-night.jpg\",\"objectid\":794}]}}\u000a"

我不知道如何确保在没有这些转义字符的情况下返回我的 JSON 结果。

我的服务.vb

Namespace RestService

<ServiceContract()>
Public Interface Imyservice

    <OperationContract()> _

_ 函数 searchFavoriteCompany(ByVal q As String, ByVal uuid As String) As String

End Interface

End Namespace   

iservice.svc.vb

Namespace RestService

Public Class iservice
    Implements Imyservice
    Public Function searchFavoriteCompany(ByVal q As String, ByVal uuid As String) As String Implements Imyservice.searchFavoriteCompany
        Dim req As HttpWebRequest = HttpWebRequest.Create("http://localhost/getjson")  <---- this service already returns JSON data
        Dim Resp As HttpWebResponse = req.GetResponse()
        Dim reader As StreamReader = New StreamReader(Resp.GetResponseStream)
        Dim responseString As String = reader.ReadToEnd()

        Return responseString

    End Function

End Class

End Namespace   

我也尝试过,而不是返回响应字符串:

HttpContext.Current.Response.Write(responseString)
return ""

但后来我收到错误“对象引用未设置为对象的实例”,我检查了:responsestring 包含一个值,所以这不是问题。

4

1 回答 1

0

如果您不能将输出直接传递给响应,最好的办法是回到传统方法,并从您的方法返回一个类型安全的对象。您已经获得了原始服务传递给您的 JSON,您的最终目标是将确切的对象返回给您的调用者。

假设您的示例中有一个完整的 JSON 对象 - 您可以首先转到json2csharp获取您的 JSON 并从中创建类。它使用 C#,但您可以使用Telerik 的 Code Converter 之类的工具轻松地将其转换为 VB 。

如果您按照这些步骤进行操作,您最终会得到几个类,包括一个名为 的类,RootObject其中包含 and 的属性,responseHeader以及response所需的其他类。您可以根据需要重命名类,并将它们放入适当的名称空间中 - 只需保留属性名称,以便它们与 JSON 匹配。

一旦你有了这个RootObject类(或者你把它重命名为什么),你可以将你从原始服务中得到的 JSON 反序列化为 type 的对象RootObject,然后你的 WebAPI 方法将简单地返回一个RootObject. 就像任何其他 WCF 调用一样,框架将负责将该对象序列化回调用方的 JSON(或 XML)。

于 2013-09-13T15:34:38.153 回答