web-dev-qa-db-ja.com

JSONからのエスケープ文字の置き換え

JSON文字列の "\"文字を空白に置き換えたいのですが。どうやってやるの?

9
cBevilaqua

JSON文字列からすべてのエスケープ文字を削除する最も簡単で最良の方法は、文字列をRegex.Unescape()メソッドに渡すことです。このメソッドは、エスケープなしの新しい文字列を返します。\ n\tなども削除されます。

詳細については、このMSDNの記事を参照してくださいRegex.Unescape Method(String)(System.Text.RegularExpressions)

23
Brad

Jsonオブジェクトが文字列の場合、次のコードスニペットに示すようにjson文字列JObject.Parse({string})をクリーンアップするには、.Netでエスケープ "\"文字を追加します。

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

var myCleanJsonObject = JObject.Parse(myJsonAsString);

エスケープ文字が削除されたクリーンなJsonオブジェクトが表示されます。

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

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

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

このタイプのエスケープ文字列は、通常、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);
0
Johan Alzate

名前または値に\が含まれている場合は、二重にエスケープされますが、C#の文字列割り当てがそれを行います。適切な方法は、variable.Replace( "\\\\"、 "\\");を使用することです。またはvariable.Replace(@ "\\"、@ "\");これにより、二重にエスケープされた\文字が削除され、値にREQUIRED \が残されます。たとえば、JSONに "Domain\Username"が含まれている場合、これは\ "Domain \\\\ Username \"として返され、それを文字列に割り当てるとDomain \\ Usernameになります。

0
Anatoly Kostin