返回没有转义字符的原始JSON字符串

时间:2011-11-18 16:43:27

标签: asp.net wcf json

我正在查看这篇文章:Returning raw json (string) in wcf。我想我遇到了同样的问题 我有一个返回JSON的休息服务,请参阅下面的代码:

IRestServiceImpl.vb

Imports System.ServiceModel
Imports System.ServiceModel.Web

Namespace RestService
' NOTE: You can use the "Rename" command on the context menu to change the interface name "IRestServiceImpl" in both code and config file together.
<ServiceContract()> _
Public Interface IRestServiceImpl
    <OperationContract()> _
    <WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="xml/{id}")> _
    Function XMLData(ByVal id As String) As String


    'WebMessageBodyStyle.Bare WAS WebMessageBodyStyle.wrapped
    <OperationContract()> _
    <WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="api/objects/json/?lat={lat}&lon={lon}&radius={radius}&cat={cat}")> _
    Function JSONData(ByVal lat As String, ByVal lon As String, ByVal radius As String, ByVal cat As String) As String
    'radius in meters


End Interface
End Namespace

RestServiceImpl.vb

Namespace RestService
Public Class RestServiceImpl
    Implements IRestServiceImpl


    Public Function XMLData(ByVal id As String) As String _
        Implements IRestServiceImpl.XMLData

        Return "XML You requested product " & id

    End Function

    Public Function JSONData(ByVal lat As String, ByVal lng As String, ByVal d As String, ByVal cat As String) As String _
        Implements IRestServiceImpl.JSONData

        'returns the results JSON in format

        'Return "JSON lat=" + lat + " lng=" + lng + " d=" + d + " cat=" + cat
        Dim sBuilder As New StringBuilder

        sBuilder.Append("{""hotspots"": [")
        sBuilder.Append("{""id"": ""test_1"",")
        sBuilder.Append("""anchor"": { ""geolocation"": { ""lat"": 52.3729, ""lon"": 4.93 } },  ")
        sBuilder.Append("""text"": {")
        sBuilder.Append("""title"": ""The Layar Office"", ")
        sBuilder.Append("""description"": ""The Location of the Layar Office"", ")
        sBuilder.Append("""footnote"": ""Powered by Layar"" },")
        sBuilder.Append("""imageURL"": ""http:\/\/custom.layar.nl\/layarimage.jpeg"",")
        sBuilder.Append("}")
        sBuilder.Append("],")
        sBuilder.Append("""layer"": ""mytest"",")
        sBuilder.Append("""errorString"": ""ok"", ")
        sBuilder.Append("""errorCode"": 0")
        sBuilder.Append("} ")

        Return sBuilder.ToString

    End Function

End Class
End Namespace

基于上面的代码,我得到了这个回复:

这在Chrome浏览器中给出了我的回复: {“JSONDataResult”:“{\”hotspots \“:[{\”id \“:\”test_1 \“,\”anchor \“:{\”geolocation \“:{\”lat \“:52.3729,\ “lon”:4.93}},\“text \”:{\“title \”:\“The Layar Office \”,\“description \”:\“Layar Office的位置\”,“脚注” \“:\”由Layar \“}提供支持,\”imageURL \“:\”http:\ / \ / custom.layar.nl \ /layarimage.jpeg \“,}],\”layer \“:\” mytest \“,\”errorString \“:\”ok \“,\”errorCode \“:0}”}

我知道由于其他线程中描述的问题(因为我正在使用WebMessageFormat.Json),因此反斜杠在我的响应中。

但我不确定如何实施http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspxhttp://msdn.microsoft.com/en-us/library/ms789010.aspxhttp://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx

上提供的代码示例

我现在将Irestserviceimpl.vb改为:

Imports System.ServiceModel
Imports System.ServiceModel.Web
Imports System.IO

Namespace RestService
' NOTE: You can use the "Rename" command on the context menu to change the interface name "IRestServiceImpl" in both code and config file together.
<ServiceContract()> _
Public Interface IRestServiceImpl
    <OperationContract()> _
    <WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="xml/{id}")> _
    Function XMLData(ByVal id As String) As String


    'WebMessageBodyStyle.Bare WAS WebMessageBodyStyle.wrapped
    <OperationContract()> _
    <WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Bare, UriTemplate:="api/objects/json/?lat={lat}&lon={lon}&radius={radius}&cat={cat}")> _
    Function JSONData(ByVal lat As String, ByVal lon As String, ByVal radius As String, ByVal cat As String) As String
    'radius in meters
End Interface


Public Class RawService
    <OperationContract(), WebGet()> _
    Public Function GetValue() As System.IO.Stream
        Dim result As String = "Hello world"
        Dim resultBytes As Byte() = Encoding.UTF8.GetBytes(result)
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"
        Return New MemoryStream(resultBytes)
    End Function
End Class

End Namespace

但我仍然不确定如何调用网址或在哪里准确放置哪些代码...如果有人可以帮助我开始在这里?

谢谢!

1 个答案:

答案 0 :(得分:1)

你的函数正在创建一个庞大的字符串,当它转换为Json时,创建一个JSON元素(是正确的单词?)只有一个属性“JSONDataResult”,它有一个值=你所做的字符串(带有所有这些引号现在已经逃脱了。)

你这样做的方式看起来很辛苦! 您是否尝试过使用WCFWebApi? 它易于实现,并且可以非常轻松地返回JSON或XML(并为您处理反序列化)