反斜杠转义问题

Backslash escaping issue

我有以下代码:

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

其中 pi.Username 由 domain\username 组成。然后使用 JavaScriptSerializer 序列化此对象,然后通过 Web 请求将其发送到 API.

我遇到的问题是,发送的值在域和用户名之间以四个反斜杠结束,因为在创建字符串时,初始的单个反斜杠被转义,然后这两个反斜杠在序列化过程中再次被转义。

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

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

[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 class 在内部调用方法 HttpUtility.JavaScriptStringEncode(input),通过调用此方法 http://referencesource.microsoft.com/#System.Web/Util/HttpEncoder.cs,c0289ba7b2d459e5 添加额外的反斜杠. 另一种选择是替换 HttpEncoder,但对我来说似乎太多了:-)。