3

独自の json エンコーダーを作成した後、二重引用符が 1 つではなく 2 つのエスケープ バックスラッシュに置き換えられていることに気付きました。

C# にはJson.Encode()メソッドが組み込まれていることがわかりました。はい、それを機能させましたが、次のコード (私が作成した json エンコーダー) が引用符を置き換えなかった理由に困惑しています。予想。

これが私のjsonエンコーダーメソッドです:

public static string jsonEncode(string val)
{
    val = val.Replace("\r\n", " ")
             .Replace("\r", " ")
             .Replace("\n", " ")
             .Replace("\"", "\\\"")
             .Replace("\\", "\\\\");

    return val;
}

これは、2 つのバックスラッシュ (上記の C# によく似たエスケープ文字としての 1 つ) を json ファイル内の単一の「実際の」バックスラッシュと見なすため、もちろん無効な json を生成Replace("\"", "\\\"")"ます。\\"意図したとおり、二重引用符。ただし、Replace("\\", "\\\\")呼び出しは完全に機能します (つまり、予想どおり、1 つのバックスラッシュが 2 つに置き換えられます)。

私の引数に基づいて、期待どおりに Replace メソッドが機能を実行していないことは簡単にわかります。私の質問はなぜですか?Replace("\"", "\\"")バックスラッシュは C# のエスケープ文字でもあるため、使用できないことがわかっているため、構文エラーが発生します。Replace("\"", "\"")二重引用符を二重引用符に置き換えるので、使用することもばかげています。

C# の replace メソッドをよりよく理解するために、Replace メソッドが予想とは異なる動作をする理由を知りたいです。Json.Encodeこのレベルのコーディングをどのように達成しますか?

4

2 に答える 2

9

バックスラッシュを2つのバックスラッシュに置き換え"\"から置き換えます...これには、作成済みのバックスラッシュが含まれます。紙の上で一度に1つずつ操作を実行すると、同じ効果が見られます。

エスケープの順序を逆にして、最初にバックスラッシュをエスケープしてから引用符を付けるだけです。

return val.Replace("\r\n", " ")
          .Replace("\r", " ")
          .Replace("\n", " ")
          .Replace("\\", "\\\\")
          .Replace("\"", "\\\"");
于 2013-03-07T15:45:52.853 に答える
3

問題はここにあります:

Replace("\"", "\\\""); // convert " to \"
Replace("\\", "\\\\"); // which are then converted to \\"

最初の行は。に置き換え"られ\"ます。\"2行目は、新しいものを。に置き換え\\"ます。

Jonが言うように、エスケープ文字を導入する前に、エスケープ文字をエスケープする置換を実行する必要があります。

しかし、私はあなたが本物のエンコーダーを使うべきだと思います。;-)

于 2013-03-07T15:45:59.693 に答える