日本語版
最新ニュース
企業

Optimizely CMSエクスポートデータでJSONケーシングを修正します

キャメルケースを実施するターゲットアクションフィルター 私の中で 前のブログ投稿、NUGETパッケージを更新した後、Optimizely CMSエクスポートでJSONフォーマットで抱えている問題について議論しました。具体的には、 /episerver/episerver.cms.ui.admin/exportdata/getExporttatus エンドポイントが返されました パスカルケース JSONプロパティ名、フロントエンドが予想されるサイトの他の部分を壊す キャメルケース。 それがUIの障害につながりました。特に、終わりのないロードスピナーです。グローバルJSON設定に影響を与えることなくこれに対処するために、 アクションフィルター これにより、この特定のルートのキャメルケースのフォーマットが保証されます。これがどのように機能しますか。 要約:JSONのフォーマットが重要な理由 多くのJavaScriptフレームワーク(ReactやAngularなど)は、CamelcaseのJSONプロパティ名を期待しています。反応が予期せずにPascalcaseで発生すると、バインディングが破損し、データが欠落したり、UIの完全な障害にさえつながります。 GSON設定をグローバルに変更する代わりに、CMS全体で意図しない結果をもたらす可能性がありますが、最良のアプローチは ターゲットを絞った修正 それが当てはまります のみ 問題のあるエンドポイントに。 解決策:輸出ステータスのためのCamelcase JSON このASP.NETコアアクションフィルターは、/episerver/episerver.cms.ui.admin/exportdata/getExporttatusからのJSON応答を保証します。 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Formatters; using System.Text.Json; using System.Linq; using System.Text.Json.Serialization.Metadata; namespace Website.API.Filters { ///…

Optimizely CMSエクスポートデータでJSONケーシングを修正します

1748980660
2025-06-02 13:17:00

キャメルケースを実施するターゲットアクションフィルター

私の中で 前のブログ投稿、NUGETパッケージを更新した後、Optimizely CMSエクスポートでJSONフォーマットで抱えている問題について議論しました。具体的には、 /episerver/episerver.cms.ui.admin/exportdata/getExporttatus エンドポイントが返されました パスカルケース JSONプロパティ名、フロントエンドが予想されるサイトの他の部分を壊す キャメルケース

それがUIの障害につながりました。特に、終わりのないロードスピナーです。グローバルJSON設定に影響を与えることなくこれに対処するために、 アクションフィルター これにより、この特定のルートのキャメルケースのフォーマットが保証されます。これがどのように機能しますか。

要約:JSONのフォーマットが重要な理由

多くのJavaScriptフレームワーク(ReactやAngularなど)は、CamelcaseのJSONプロパティ名を期待しています。反応が予期せずにPascalcaseで発生すると、バインディングが破損し、データが欠落したり、UIの完全な障害にさえつながります。

GSON設定をグローバルに変更する代わりに、CMS全体で意図しない結果をもたらす可能性がありますが、最良のアプローチは ターゲットを絞った修正 それが当てはまります のみ 問題のあるエンドポイントに。

解決策:輸出ステータスのためのCamelcase JSON

このASP.NETコアアクションフィルターは、/episerver/episerver.cms.ui.admin/exportdata/getExporttatusからのJSON応答を保証します。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Formatters;
using System.Text.Json;
using System.Linq;
using System.Text.Json.Serialization.Metadata;

namespace Website.API.Filters
{
    /// 
    /// Action filter to enforce camelCase JSON for /EPiServer/EPiServer.Cms.UI.Admin/ExportData/GetExportStatus responses.
    /// 
    public class CamelCaseJsonForExportStatusFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // No action needed before execution
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Only apply to the specific route
            var path = context.HttpContext.Request.Path.Value;
            if (!string.Equals(path, "/EPiServer/EPiServer.Cms.UI.Admin/ExportData/GetExportStatus",
                    StringComparison.OrdinalIgnoreCase))
                return;

            if (context.Result is ObjectResult objectResult)
            {
                // Find the SystemTextJsonOutputFormatter and update its options
                var jsonFormatter = objectResult.Formatters
                    .OfType()
                    .FirstOrDefault();

                if (jsonFormatter != null)
                {
                    // Update the naming policy to camelCase
                    jsonFormatter.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                }
                else
                {
                    objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(
                        new JsonSerializerOptions
                        {
                            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                            WriteIndented = false,
                            TypeInfoResolver = new DefaultJsonTypeInfoResolver()
                        }
                    ));
                }
            }
        }
    }
}

プラグインする方法

startup.csに以下を追加して、フィルターをグローバルに登録します(ルートごとに自己フィルターを備えているため):

フィルターは、リクエストが /exportData /getExportStatusの場合にのみロジックを実行するため、アプリ全体で登録するのは安全です。

それがどのように機能するか

  1. 応答を傍受します
  • フィルターを実装します iActionFilter、 アクションが実行された後の応答の変更。
  • OnactionExecuting 実行前に変更が不要なため、空のままです。
  • OnactionExected 要求パスがエクスポートステータスエンドポイントと一致するかどうかを確認します。
  • JSONフォーマットの適用
    • 応答が次の場合 ObjectResult、 既存のものを検索します SystemTextJSonOutputFormatter
    • 見つかった場合、それはそれを更新します serializeroptions.propertynamingpolicyjsonnamingpolicy.camelcase
    • フォーマッタが存在しない場合、それ 追加します 正しい設定を備えた新しいもの。

    なぜこのアプローチ?

    • スコープされた修正 – 影響のみ /データのエクスポート/エクスポートステータスを取得します、他のJSON応答を触れられないままにします。
    • 最小限のオーバーヘッド – 可能であれば既存のフォーマッタを変更し、パフォーマンスを最適化します。
    • 将来のプルーフ – 最適化されたCMSが後でその動作を更新しても、フォーマッタが存在するようにします。

    結論

    このターゲットアクションフィルターは、Optimizely CMSでの予期しないJSONのフォーマット問題を防ぎます。キャメルケースを実施することにより のみ エクスポートステータス応答の場合、グローバル設定への不必要な変更を回避しながら、UIの障害を排除します。

    代替のアプローチや考えがある場合は、コメントにドロップしてください。

    2025年6月2日

    #Optimizely #CMSエクスポートデータでJSONケーシングを修正します

    執筆者について: nipponese

    Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。