从JSON替换转义字符

cBe*_*qua 10 c# string json replace

我想用空格替换JSON字符串中的"\"字符.我怎样才能做到这一点?

小智 23

我发现从JSON字符串中删除所有转义字符的最简单和最好的方法是将字符串传递给Regex.Unescape()方法.此方法返回一个没有ecapes的新字符串,即使\n\t等也被删除.

有关更多详细信息,请参阅此MSDN文章: Regex.Unescape方法(字符串)(System.Text.RegularExpressions)

  • 我知道这个问题有点老了,但是有没有人建议将 JSON 反序列化为字符串的原因?像:`var json = JsonConvert.DeserializeObject<string>(escapedJson);` JSON 序列化器肯定是为此而构建的吗? (6认同)
  • 这是唯一正确的答案.当你在json内容中有\时,盲目地用空替换所有\字符将不起作用. (4认同)
  • 我同意@JamieTwells 的观点。首先,反序列化为另一个字符串(非转义字符串):“string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);”(您可以重复多次),然后,您可以再次反序列化为目标类型:“MyClass” targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);` (2认同)

Joh*_*ate 12

这种类型的转义字符串通常在您尝试第二次将 JSON 字符串编码为 JSON 时生成。这会导致类似“不同级别的序列化”

解决方案:

  • 首先需要将转义后的字符串反序列化,但不是反序列化到目标CLR类型,而是反序列化到另一个字符串
  • 如有必要,再次将反序列化为字符串类型。
  • 然后对目标类型执行最终反序列化:

代码:

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 这种方法对我来说很崩溃 (3认同)
  • 最好的方法。(是) (2认同)

Sim*_*mba 9

如果json对象是一个字符串,则在.Net中添加转义“ \”字符,如果您想清理json字符串JObject.Parse({string}),如下面的代码片段所示,则可以很好地清理:

var myJsonAsString = "{\"Name\": \"John\", \"LastName\": \"Doe\", \"Age\": 199 }";

var myCleanJsonObject = JObject.Parse(myJsonAsString);
Run Code Online (Sandbox Code Playgroud)

应该给我们一个干净的Json对象,并删除转义字符。

{
"Name": "John",
"LastName": "Doe",
"Age": 199
}
Run Code Online (Sandbox Code Playgroud)

  • 来自“var myJsonAsString”的原始字符串中已经没有“\​​”(反斜杠)。要在字符串中获取反斜杠,请使用`"\\"`。然后会抛出异常,因为“JObject.Parse”会考虑反斜杠,除非后面跟着合法的转义字符、非法的 JSON(并且正确地如此)。 (4认同)
  • 就我而言,我必须在序列化对象后执行此操作。字符串脏= JsonConvert.SerializeObject(jsonObject); 返回 JObject.Parse(dirty).ToString(); (2认同)

Ale*_*xei 5

Regex.Unescape()该方法在大多数情况下都可以正常工作,但是某些特定情况下需要自定义替换。例如,Regex.Unescape()将生成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"}
Run Code Online (Sandbox Code Playgroud)

正则表达式

{"comments_count":27,"comments":"<a name="comments"></a>

Replacements
    <div class="CommentsList">
        <strong>Comments</strong>
"}
Run Code Online (Sandbox Code Playgroud)

自定义替换

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>"}
Run Code Online (Sandbox Code Playgroud)

  • @WULF 看起来您在每个提到 Regex.Unescape 的答案中都添加了该注释,而这个答案明确指出 `\r` `\n` 和 `\t` 作为它不处理的字符。 (2认同)

小智 0

C# 字符串赋值可以为您完成此操作,但如果名称或值包含 \,则会进行双重转义。正确的方法是使用variable.Replace("\\\\","\\"); 或变量.Replace(@"\\",@"\"); 这将删除双转义 \ 字符,保留 REQUIRED \ 值。例如,如果 JSON 包含“Domain\Username”,则这将返回为 \“Domain\\\\Username\”,将其分配给字符串将导致您将拥有 Domain\\Username