1

コンポーネントを JSON にシリアル化すると、設定されているプロパティまたはデフォルト値を持つプロパティのみが出力されます。phone私の例では、プロパティがシリアル化されていないことがわかります。ColdFusion でその動作を変更する方法はありますか?

ユーザー.cfc:

component accessors="true" {
    property name="firstName";
    property name="lastName";
    property name="email" default="";
    property name="phone";
}

新しいユーザーを作成し、プロパティを設定して、JSON にシリアル化します。

var user = new User();
user.setFirstName("Homer");
user.setLastName("Simpson");
writeOutput(serializeJSON(user));

JSON 出力:

{"firstName":"Homer","email":"","lastName":"Simpson"}
4

2 に答える 2

3

あなたが見ているのは ColdFusion 11 のバグだと思いますので、それに応じてバグ トラッカーで報告する必要があります。

幸いなことに、ColdFusion 11 には、コンポーネントの独自のシリアライゼーション プロセスを定義するためのメカニズム (あまり実現されていませんが、IMO) があります。

この機能のドキュメントは「プラグ可能なシリアライザーとデシリアライザーのサポート」にあります。また、ブログ「ColdFusion 11: カスタム シリアライザー。答えよりも多くの質問」で調査を行っています。

これを実装する方法は、スタック オーバーフローの回答には長すぎます。公式ドキュメントにはすべて十分に記載されています。

于 2014-09-02T08:32:19.127 に答える
1

他の誰かが CF9 でこれに対処している場合に備えて、私が問題を解決した方法は、https://mvnrepository.com/artifact/com.fasterxml.jackson.coreから Jackson (コア、注釈、およびデータバインドをダウンロード) を使用することでした) 、次に JavaLoader を使用して JAR をマウントします。

    <Cfset var paths = []>
    <cfset paths[1] = expandPath("/api/v1/lib/jackson-core-2.0.0.jar")>
    <cfset paths[2] = expandPath("/api/v1/lib/jackson-annotations-2.0.0.jar")>
    <cfset paths[3] = expandPath("/api/v1/lib/jackson-databind-2.0.0.jar")>
    <cfset application.javaloader = createObject("component", "javaloader.JavaLoader").init(paths)>

次に、CFC から Jackson を呼び出します。

    <cfset variables.jackson = application.jackson />
    <cfset var json = jackson.writeValueAsString(variables.data) />

正しいブール値、数値、および整数値を取得するために、ColdFusion から変数を JavaCast する必要があることに注意してください (組み込みシリアライザーのような自動入力はありません)。Jackson ははるかに高速であり、(明示的な入力が必要であるにもかかわらず)カスタム シリアライザーよりも信頼性が高くなります。

于 2016-08-08T23:02:07.283 に答える