0

FlexJSON を使用しています (ただし、他のライブラリを使用できます)。json 配列を手動で作成したいと考えています。シリアル化されているモデルの一部ではないものを追加する必要があります。たとえば、json 配列に html 列と css 列を追加したいとします。このデータは、リストを繰り返し処理し、値が特定の数値を上回っているか下回っているかを確認することによって決定されます。

今はこれしか持っていません。

   JSONSerializer json = new JSONSerializer();
    json.transform(new DateTransformer("MM/dd/yyyy hh:mm:ss"), "timeStamp");
    json.transform(new DecimalTransformer("#.00") , "ounces");
    json.include("timeStamp", "ounces");
    json.exclude("*");
    json.prettyPrint(true);

    response.setContentTypeIfNotSet("application/json");
    response.out.write(json.serialize(list).getBytes());  

しかし、シリアル化を呼び出すだけでなく、この配列を手動で構築したいと考えています。オンス数が特定の数を下回っているとすると、css 列の値が変更されるはずです。css 列はオブジェクト (モデル) の一部ではないため、手動で追加する必要があります。ありがとう。

4

1 に答える 1

1

Flexjson およびその他の JSON シリアル化ライブラリは、モデルの構造をガイドとして使用するため、JSON に入れたいデータがモデルにある場合に最適に機能します。Flexjson は、シリアル化中にプロパティ メソッド (getter/setter) を使用します。したがって、あなたが言っていたような計算を追加したい場合は、getCssColumn() プロパティ メソッドを追加すると、Flexjson はそれを古いプロパティとして扱います。

public String getCssColumn() {
   return ounces < SOME_THRESHOLD ? "tooSmall" : "justRight";
}

したがって、これらのメソッドを必要なだけオブジェクトに追加でき、オブジェクトの実際のインスタンス変数と同じようにシリアル化されます。これは、計算された値を探しているとおりに JSON 出力にレンダリングするための優れたトリックです。

それが気に入らない場合は、モデル オブジェクトをラップするラッパー オブジェクトを作成して、モデルに追加するデータを追跡することをお勧めします。JSON 出力には柔軟に対応する必要がありますが、値をラップすることはできます。次のような結果になる可能性があります。

{
    "cssColumn": "justRight",
    ...
    "data": {
        "ounces": 45,
        ...
    }
}

データがモデル オブジェクトを指しているため、ルートから 1 レベル下がっています。このオプションは、もう少し多くのメモリを消費し、機能するためにもう少し多くの構造 (別名、より多くのクラスを作成する) を必要とするため、私なら最初のオプションを選びます。

于 2011-06-13T17:29:50.417 に答える