【问题标题】:wcf rest appending escape characters to HTML tagswcf rest 将转义字符附加到 HTML 标记
【发布时间】:2011-09-09 00:08:20
【问题描述】:

我正在尝试将现有的 .Net 商店网站转换为 Android 应用程序。

(这是在VB中)

其中一个主要对象保存产品数据。

在该对象中,例如:

<H2>Product Title</H2>
<P>A description</P>

我已经构建了一个 WCF Rest 服务,它返回我期望的数据:...

话虽如此,我已经试用了 Newtonsoft.Json 和 DataContractJsonSerializer,它们产生相同但不同的输出。

当使用 Newtonsoft.Json 在调试中运行 WCF 服务时,它会按照我的预期返回这些项目:

牛顿软件:

<H2>Product Title<\/H2><P>A description<\/P>

DataContractJsonSerializer:

<H2>Product Title<\\\/H2><P>A description<\\\/P>

但是,当我通过 Eclipse 运行 Android 应用程序时,我收到“无效的转义序列(有效的转义序列是 \b \t \n \f \r \" \' \ )”的错误

所以,简而言之;如何阻止 Newtonsoft 或 DataContractJsonSerializer 插入这些转义序列?

谢谢 戴夫

更新:

我已经追踪到 WCF 正在做的事情(?)。这是我返回 JSON 字符串的代码的最后一点:

retVal = CacheManager.JSONFullProduct("P" & ProductID)

此时,'retVal' 正在存储关闭 HTML 标记,仅包含 '/'

retVal = retVal.Replace("\/", "/")

此时,'retVal' 仍在存储关闭 HTML 标记,仅包含 '/'

Return retVal

此时,'retVal' 本身仍然只使用'/' 存储关闭 HTML 标记,但是当它实际返回时(如果我直接运行服务,则返回到记事本,或者返回到 Android)'/' 突然变为 ' {反斜杠}/'

我尝试在 android 应用中进行字符串替换:

result.replace("\/", "/");

但这会返回“无效的转义序列...”的相同错误,而且无论如何,我真的不想在电话上做这种工作。

那么,Return retVal 发生了什么突然插入所有这些转义字符??

【问题讨论】:

    标签: wcf


    【解决方案1】:

    我搜索了很多关于这个问题的答案,终于找到了。

    我会分享给遇到同样问题的其他人:

    这是 WCF Rest 服务。

    同时学习WCF和Android让我相信WCF的响应应该是Json格式序列化的String。

    为此,一个 .Net 对象、数组或任何会通过 DataContractJsonSerializer 的东西,然后作为字符串返回给 Android 以供进一步解析。

    类似这样的:

    Dim stream1 As MemoryStream = New MemoryStream
    Dim ser As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(myType))
    ser.WriteObject(stream1, myThing)
    Dim _json As String = Encoding.UTF8.GetString(stream1.ToArray())
    stream1.Close()
    return _json
    

    错了。

    保留您的对象、数组或其他任何东西,然后将其返回; WCF 会为您处理正确的转义。

    例如(这是VB);

    IService:

    <OperationContract()> _
    <WebGet(BodyStyle:=WebMessageBodyStyle.WrappedRequest, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json, UriTemplate:="/MyKit/{AccountID}")> _
    Function GetKit(ByVal AccountID As String) As MyKit
    

    服务:

    Public Function GetKit(ByVal AccountID As String) As MyKit Implements IService1.GetKit
    
        Dim allKit As New MyKit() //Your object
        objDal.CommandText = 'run some sql here - or whatever
    
        Using dr As SqlDataReader = "blah"
    
        //populate your object
    
        End Using
    
        Return allKit //return the object, not the string representation of it
    
    End Function
    

    使用 DataContractJsonSerializer 作为 Json 从 WCF 发送到 Android 可以有效地“预转义”数据。当它到达 Android 时,Json 解析器无法处理它,因为它还会转义数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2020-03-09
      相关资源
      最近更新 更多