【发布时间】:2013-05-17 12:58:20
【问题描述】:
我想用空格替换 JSON 字符串中的“\”字符。 我该怎么做?
【问题讨论】:
-
类似的帖子在这里stackoverflow.com/questions/4253367/…。看看吧。
-
只是猜测,但我认为您不需要替换任何字符。可能您使用调试器检查 json 字符串(提示:使用放大镜图标查看原始文本)。
我想用空格替换 JSON 字符串中的“\”字符。 我该怎么做?
【问题讨论】:
只需获取 json 字符串并将其设为 String.Replace()
string JsonContentFixed = JsonContentString.Replace(@"\", " ");
【讨论】:
Replace(@"\", " ")已经是一个字符串,那为什么需要呢?请对此有所了解。
试试这个
json.Replace(@"\", " ")
【讨论】:
您可以使用Replace()
string variable = "{\"data\": {\"id\": \"1\",\"name\": \"jon\"}}";
Console.WriteLine(variable.Replace("\\", " "));
【讨论】:
基本上你是在问如何在 C# 中替换反斜杠。
你必须使用String.Replace 方法。文档告诉我们:
String.Replace 方法(字符串,字符串)返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定字符串。
因此,您的字符串将采用Replacemethod 返回的值:
jsonString= jsonString.Replace(@"\"," ");
【讨论】:
C# 字符串赋值会为您执行此操作,尽管如果名称或值包含 \,它将被双重转义。 正确的方法是使用 variable.Replace("\\\\","\\");或 variable.Replace(@"\\",@"\"); 这将删除双转义 \ 字符,保留 REQUIRED \ 值。例如,如果 JSON 包含“Domain\Username”,这将返回为 \"Domain\\\\Username\" 将其分配给字符串将导致您将拥有 Domain\\Username
【讨论】:
我发现从 JSON 字符串中删除所有转义字符的最简单和最好的方法是将字符串传递给 Regex.Unescape() 方法。 此方法返回一个没有转义符的新字符串,甚至删除了 \n \t 等。
有关详细信息,请参阅此 MSDN 文章: Regex.Unescape Method (String) (System.Text.RegularExpressions)
【讨论】:
var json = JsonConvert.DeserializeObject<string>(escapedJson); JSON 序列化器肯定是为此而构建的吗?
string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);(可以重复多次),然后,您可以再次反序列化为目标类型:MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);
str = Regex.Unescape("\r \n a"); >str "\r \n a"
Regex.Unescape("\\r \\b a");
Regex.Unescape() 方法在大多数情况下都可以正常工作,但某些特殊情况需要自定义替换。例如。 Regex.Unescape() 将生成实际的换行符,即not supported in JSON。
未转义的 JSON:
{"comments_count":27,"comments":"<a name=\"comments\"><\/a>\n\n\t\n\t\n\t\t\n\t<div class=\"CommentsList\">\n\t\t<strong>COMENTARII<\/strong>\n\t\t"}
Regex.Unescape
{"comments_count":27,"comments":"<a name="comments"></a>
Replacements
<div class="CommentsList">
<strong>Comments</strong>
"}
自定义替换
private string SanitizeReceivedJson(string uglyJson)
{
var sb = new StringBuilder(uglyJson);
sb.Replace("\\\t", "\t");
sb.Replace("\\\n", "\n");
sb.Replace("\\\r", "\r");
return sb.ToString();
}
{"comments_count":27,"comments":"<a name=\"comments\"><\/a>\n\n\t\n\t\n\t\t\n\t<div class=\"CommentsList\">\n\t\t<strong>COMENTARII<\/strong>"}
【讨论】:
str = Regex.Unescape("\r \n a"); >str "\r \n a"
\r \n 和 \t 称为它不处理的字符。
如果 json 对象是字符串,在 .Net 中会添加转义“\”字符,如果要清理 json 字符串,JObject.Parse({string}) 如下代码所示 sn-p清理得很好:
var myJsonAsString = "{\"Name\": \"John\", \"LastName\": \"Doe\", \"Age\": 199 }";
var myCleanJsonObject = JObject.Parse(myJsonAsString);
应该给我们一个干净的 Json 对象,去掉转义字符。
{
"Name": "John",
"LastName": "Doe",
"Age": 199
}
【讨论】:
var myJsonAsString 的原始字符串中已经没有\(反斜杠)。要在字符串中获取反斜杠,请使用 "\\"。然后会抛出,因为JObject.Parse 会考虑反斜杠,除非后面跟着合法的转义字符、非法的 JSON(正确如此)。
这种类型的转义字符串通常是在您尝试将 JSON 字符串再次编码为 JSON 时生成的。 这会导致类似“各种级别的序列化”
解决方案:
代码:
// Initial example json string: "\"{\\\"Property1\\\":1988,\\\"Property2\\\":\\\"Some data :D\\\"}\""
// First, deserialize to another string (unescaped string).
string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);
// Result: "{\"Property1\":1988,\"Property2\":\"Some data :D\"}"
// Second, deserialize to another string, again (in this case is necessary)
var finalUnescapedJsonString = JsonConvert.DeserializeObject<string>(unescapedJsonString);
// {"Property1":1988,"Property2":"Some data :D"} This time prints a final, unescaped, json string:
// Finally, perform final deserialization to the target type, using the last unescaped string.
MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);
【讨论】:
在 c# 中,您只有一种方法可以创建标准 JSON 结果:
您必须使用自定义属性名称添加一个类,然后返回 Json(myClassForJsonResult) 作为底部代码:
public ActionResult testJsonData()
{
var myClassForJsonResult=new YourClassOfYourCustomProperties();
myClassForJsonResult.FirstPropertyStringType="first";
myClassForJsonResult.SecondPropertyIntType=2;
return Json(myClassForJsonResult);
}
类定义:
public class YourClassOfYourCustomProperties
{
public string FirstPropertyStringType{ get; set; }
public int SecondPropertyIntType{ get; set; }
}
【讨论】:
你可以使用 Regex.Unescape(yourEscapedString);
【讨论】:
str = Regex.Unescape("\r \n a"); >str "\r \n a"