【问题标题】:ASP.NET REST service without escape characters in JSON resultsJSON 结果中没有转义字符的 ASP.NET REST 服务
【发布时间】:2013-09-12 22:52:50
【问题描述】:

我正在调用一个 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 结果。

Imyservice.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 包含一个值,所以这不是问题。

【问题讨论】:

  • 看看this question 看看是否有帮助。
  • 如果服务已经返回 JSON 数据,以上所有内容(无论如何)是什么?除了返回一个字符串(大概现在使用字符串内容类型而不是应用程序/json)之外,真的没有看到你在做什么?
  • @JoeEnos:我根据您在其他帖子中的建议更新了我的帖子,但它仍然不起作用 EdSF:您是对的,但我的其他服务是本地服务,不能通过 REST 直接访问。我将如何按照您的建议更改内容类型?
  • 这是托管在 IIS 中还是自托管,例如在 Windows 服务中?如果它是自托管的,那么 HttpContext.Current 上的 NullReferenceException 是有意义的。
  • 如何检查? :$ 如果它是自托管的,我将如何解决它?

标签: asp.net json rest escaping


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2011-03-21
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多