反斜杠逃避问题

时间:2015-01-20 17:23:54

标签: c# serialization escaping javascriptserializer

我有以下代码:

search.UserToken = string.Format(@"{0};{1}", pi.Username, pi.Password)
JavaScriptSerializer jss = new JavaScriptSerializer();
string data = jss.Serialize(obj);

pi.Username由域\用户名组成。然后,在将此对象通过Web请求发送到API之前,使用JavaScriptSerializer对其进行序列化。

我遇到的问题是发送的值最终会在域和用户名之间产生四个反斜杠,就像创建字符串一样,初始化的单反斜杠被转义,然后在序列化过程中再次转义这些反斜杠。

如何防止这种情况发生,以免它被转义两次?

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。您可以查看以下代码段:

[TestClass]
public class JavascriptSerializerTest
{
    [TestMethod]
    public void TestEscapeOnJavascriptSerializer()
    {
        const string replaceableToken = "[replace_here]";
        var user = @"domain\user".Replace(@"\", replaceableToken);
        const string password = "123456";

        var token = new Token { Value = string.Format("{0};{1}", user, password) };
        var serializer = new JavaScriptSerializer();

        var jsonObject = serializer.Serialize(token);
        jsonObject = jsonObject.Replace(replaceableToken, @"\");
        Assert.AreEqual("{\"Value\":\"domain\\user;123456\"}", jsonObject);
    }
}

public class Token
{
    public string Value { get; set; }
}

<强>解释

JavaScriptSerializer类在内部调用方法 HttpUtility.JavaScriptStringEncode(input),通过调用此方法http://referencesource.microsoft.com/#System.Web/Util/HttpEncoder.cs,c0289ba7b2d459e5来添加额外的反斜杠。 另一个选择是替换 HttpEncoder ,但对我来说似乎太过分了: - )。