替换JSON中的转义字符

本文关键字:转义字符 JSON 替换 | 更新日期: 2023-09-27 18:14:45

我想用空格替换JSON字符串中的"'"字符。我该怎么做呢?

替换JSON中的转义字符

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

更多详细信息请参阅MSDN文章:正则表达式。Unescape Method (String) (system . text . regulareexpressions)

如果json对象是一个字符串,在。net中会添加转义"'"字符,如果你想清理json字符串,JObject.Parse({string})可以很好地清理,如下面的代码片段所示:

var myJsonAsString = "{'"Name'": '"John'", '"LastName'": '"Doe'", '"Age'": 199 }";
var myCleanJsonObject = JObject.Parse(myJsonAsString);

应该给我们一个干净的Json对象,去掉转义字符。

{
"Name": "John",
"LastName": "Doe",
"Age": 199
}

这种类型的转义字符串通常在您第二次尝试将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);

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"}

正则表达式。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>"}

c#字符串赋值为您实现了这一点,尽管如果name或value包含'它将被双转义。正确的方法是使用variable.Replace("''''","''");或variable.Replace (@"''",@"'");这将删除双转义'字符,留下REQUIRED ' in值。例如,如果JSON包含"域'用户名",这将返回为'"域''''用户名'",将其分配给字符串将导致您将拥有域''用户名

反序列化到另一个字符串,然后到你的类

string resultString = JsonConvert.DeserializeObject<string>(content);
var result = JsonConvert.DeserializeObject<T>(resultString);

在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);

var json = system . text . json . jsonserializer . deserializejsonelement>(escapedJson)