反斜杠转义问题
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,但对我来说似乎太多了:-)。
我有以下代码:
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,但对我来说似乎太多了:-)。