閉じる

【C#11】生文字列リテラルでJSONを扱う!エスケープ不要な書き方を解説

C#の開発において、JSONデータを取り扱う機会は非常に多くなっています。

これまでのC#では、文字列の中にJSONを直接記述しようとすると、ダブルクォートのエスケープ処理が必要になり、コードの可読性が著しく低下するという課題がありました。

しかし、C# 11で導入された生文字列リテラル(Raw String Literals)を活用することで、JSONをそのままの形でコード内に埋め込むことが可能になりました。

本記事では、生文字列リテラルの基本から、JSON操作における革命的な利便性、そして詳細な記述ルールについて詳しく解説していきます。

JSON文字列の定義における「これまでの苦労」

C# 11が登場する前、プログラム内でJSONを定義するのは非常にストレスの溜まる作業でした。

JSONはキーと値の両方を"(ダブルクォート)で囲む必要があるため、C#の通常の文字列リテラル内では、これらをすべて"のようにエスケープしなければならなかったからです。

まずは、従来の書き方がどれほど複雑であったか、コード例を見てみましょう。

C#
using System;

public class Program
{
    public static void Main()
    {
        // 従来の逐次リテラルや通常のリテラルでの記述
        // ダブルクォートをエスケープするために \" が大量に必要になる
        string legacyJson = "{\n  \"name\": \"Alice\",\n  \"age\": 25,\n  \"city\": \"Tokyo\"\n}";
        
        Console.WriteLine("--- 従来の書き方 ---");
        Console.WriteLine(legacyJson);
    }
}
実行結果
--- 従来の書き方 ---
{
  "name": "Alice",
  "age": 25,
  "city": "Tokyo"
}

このように、小さなJSONであればまだ耐えられますが、階層が深く複雑なデータ構造になると、バックスラッシュの嵐となり、タイポ(打ち間違い)が発生しやすくなります。

また、外部のJSONファイルから値をコピーしてC#コードに貼り付ける際にも、手動でエスケープを挿入するか、変換ツールを通す必要がありました。

この「コピペができない」という点は、開発効率を大きく下げる要因となっていました。

生文字列リテラルの基本構文

C# 11で導入された生文字列リテラルは、少なくとも3つのダブルクォート"""で囲むことで定義されます。

この形式を使用すると、文字列内の特殊文字をエスケープする必要が一切なくなります。

基本的な書き方

生文字列リテラルを使用すると、先ほどのJSONは以下のように記述できます。

C#
using System;

public class Program
{
    public static void Main()
    {
        // 3つのダブルクォートで囲むだけでOK
        string rawJson = """
        {
          "name": "Alice",
          "age": 25,
          "city": "Tokyo"
        }
        """;
        
        Console.WriteLine("--- 生文字列リテラル ---");
        Console.WriteLine(rawJson);
    }
}
実行結果
--- 生文字列リテラル ---
{
  "name": "Alice",
  "age": 25,
  "city": "Tokyo"
}

この記法の最大の特徴は、ダブルクォートをそのまま書けることです。

JSON形式をそのまま維持できるため、ドキュメントや外部ツールからのコピー&ペーストが容易になり、メンテナンス性も飛躍的に向上します。

インデントのルール

生文字列リテラルには、コードの見た目を綺麗に保つためのインデント制御ルールがあります。

文字列の終了を告げる"""の位置が基準となり、その位置よりも左側にある空白は無視されます。

この仕組みにより、C#のコード構造に合わせてインデントを深くしても、出力される文字列に余計な先頭スペースが含まれることはありません。

C#
public void PrintJson()
{
    // 終了の """ の位置に合わせて、左側の空白が自動的にカットされる
    string json = """
        {
          "message": "Hello, World!"
        }
        """; // この列が基準

    Console.WriteLine(json);
}

もし、終了の"""よりも左側に文字列を記述しようとすると、コンパイルエラーが発生します。

これにより、実行時に意図しないインデントのズレが生じるのを防いでくれます。

JSON内の変数展開(文字列補間)

JSONを動的に生成したい場合、文字列の中に変数を埋め込む「文字列補間(Interpolation)」が必要になります。

通常の文字列リテラルでは$を使用しますが、JSONでは波括弧{}が特別な意味(オブジェクトの開始・終了)を持つため、工夫が必要です。

複数個の$記号を使うマジック

C# 11では、$を複数個並べることで、「変数展開に使用する波括弧の数」を指定できるようになりました。

例えば、$$"""のように$を2つ使うと、波括弧が2つ重なった箇所{{ ... }}のみが変数展開として認識されるようになります。

これにより、JSONの構造としての{はそのまま出力しつつ、特定の箇所だけを変数値で置き換えることが可能になります。

C#
using System;

public class Program
{
    public static void Main()
    {
        string userName = "C# Developer";
        int accessCount = 1024;

        // $を2つ使うことで、{{ }} を変数展開のトリガーにする
        string dynamicJson = $$"""
        {
          "user": "{{userName}}",
          "stats": {
            "access": {{accessCount}},
            "active": true
          }
        }
        """;

        Console.WriteLine(dynamicJson);
    }
}
実行結果
{
  "user": "C# Developer",
  "stats": {
    "access": 1024,
    "active": true
  }
}

この機能がない場合、JSONの波括弧をエスケープするために{{}}を大量に書く必要があり、非常に読みづらいコードになっていました。

しかし、$$を使用することで、JSON本来のシングル波括弧はそのままに、埋め込みたい場所だけをダブル波括弧にするという、非常に直感的で整理された記述が実現できます。

3つ以上のクォートを使用する場合

稀なケースですが、JSONの値自体に"""という連続したダブルクォートを含めたい場合があります。

その場合は、開始と終了のダブルクォートを「内容に含まれる最大連続数よりも多く」すれば解決します。

例えば、内容に3つのダブルクォートを含めたい場合は、4つのダブルクォートで囲みます。

C#
// 内容に """ が含まれる場合、4つのクォートで囲む
string complexString = """"
{
  "comment": "これは3つのクォート \""" を含む例です"
}
"""";

Console.WriteLine(complexString);

このように、生文字列リテラルは非常に柔軟性が高く、どのような文字列データであっても確実にそのまま保持できる設計になっています。

実践的な活用シーン

生文字列リテラルは、単なるコードの見た目の改善に留まらず、開発プロセス全体に良い影響を与えます。

1. 単体テストにおける期待値の定義

Web APIのテストなどでは、期待されるJSONレスポンスをコード内に定義することがよくあります。

生文字列リテラルを使えば、Postmanやブラウザのデベロッパーツールから取得したJSONをそのまま貼り付けてテストデータとして利用できます。

項目従来のテストコード生文字列リテラルを用いたテストコード
可読性低い (エスケープが多い)非常に高い (JSONそのもの)
保守性修正時にエスケープの配慮が必要そのまま修正可能
コピペ不可能(手動変換が必要)そのまま可能

2. モックデータの作成

開発初期段階で、サーバーが未完成の場合にローカルでモック(ダミー)データを返す必要があります。

生文字列リテラルを使えば、巨大なJSONであってもクラスファイル内に分かりやすく記述しておくことができます。

生文字列リテラル使用時の注意点

非常に便利な生文字列リテラルですが、いくつか意識しておくべきポイントがあります。

改行コードの扱い

生文字列リテラルは、ソースファイルに記述された改行コード(CRLF または LF)をそのまま保持します。

チーム開発で異なるOS(WindowsとMacなど)を使用している場合、Gitの設定によっては改行コードが自動変換され、文字列のバイナリデータが変わってしまう可能性があります。

厳密な比較を行う場合は、必要に応じてstring.Replaceなどで改行コードを統一する処理を検討してください。

空白の厳密な管理

終了の"""の位置よりも左側にコンテンツを配置できないルールは、「半角スペースとタブが混在している場合」にも厳格に適用されます。

エディタの設定でインデントをタブにしている場合とスペースにしている場合が混ざると、コンパイルエラーの原因になることがあります。

基本的にはIDE(Visual Studioなど)の自動フォーマット機能に任せるのが安全です。

まとめ

C# 11で導入された生文字列リテラルは、JSONを扱うすべてのC#開発者にとって必須の知識と言えます。

ダブルクォートのエスケープから解放されるだけでなく、$$を用いた柔軟な変数展開や、インデントの自動制御など、モダンな開発に求められる機能が凝縮されています。

これまでJSONの定義に苦労していた方は、ぜひ今日から生文字列リテラルを取り入れてみてください。

コードの可読性が向上するだけでなく、バグの混入を防ぎ、開発スピードを大幅に向上させることができるはずです。

C#は進化し続けており、このような構文の改善を積極的に活用することで、より洗練されたプログラムを記述できるようになります。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!