8

テンプレート エンジンを使用して有効な JSON を生成したいと考えています。特に、テンプレート内のプレースホルダーをモデル クラスのプロパティに置き換えるエンジンが必要です。エンジンは、 のような複雑なクラスの使用コンバーターを許可する必要がありますjava.util.Date。さらに、テンプレート自体でリストを明示的に処理したくはありません。代わりに、コレクションのような型で有効な JSON 配列を生成する必要があります。

これはテンプレートの例です。

{
  "uber" :
  {
    "version" : "1.0",
    "data" :
    [
      {
        "rel" : $relations,
        "data" :
        [
          {"name" : "firstname", "value" : $firstname},
          {"name" : "lastname", "value" : $lastname}
        ]
      }
    ]
  }
}

$relationsこのテンプレートの変数 ( 、$firstname$lastname) を、リレーション、名、姓のプロパティを持つモデルから置き換えたいと考えています。これは、ネストされたプロパティでも機能するはずです。(例: $address.street)

モデルをバインドすると、JSON は次のようになります。

{
  "uber" :
  {
    "version" : "1.0",
    "data" :
    [
      {
        "rel" : ["person"],
        "data" :
        [
          {"name" : "firstname", "label" : "Firstname", "value" : "Max"},
          {"name" : "lastname", "label" : "Lastname", "value" : "Mustermann"}
        ]
      }
    ]
  }
}

エンジンは、必要に応じて引用符を使用する必要があることに注意してください。

これを行うことができるテンプレート ライブラリはありますか、それとも独自のライブラリを展開する必要がありますか?

私はすでに次のライブラリを調べました:

  • フリーマーカー
  • 速度
  • 文字列テンプレート

また、いくつかのスレッドも読みました。

しかし、今のところ満足のいく解決策は見つかりませんでした。

背景情報:

Uberdataは、データをエンコードするために要素をネストする、ドメインに依存しないハイパーメディア形式です。多くのオブジェクトを作成し、セッターを介してそれらをネストする必要があるため、Jackson のようなライブラリでシリアル化する場合、この形式を作成するのは非常に面倒です。

そのため、テンプレートを使用して出力を生成し、ユーザーがテンプレートを作成し、後でモデルをこのテンプレートにバインドして出力を生成できるようにすることを考えました。

4

1 に答える 1

2

私の質問に対する答えを見つけました:

テンプレートの変数に次の表記法を使用しています: $(json.path.to.value). 変数定義に準拠する JSON 内の値を検索する JayWay によるJsonPathライブラリのカスタムを実装しPredicateました。

述語はDocumentContext、変数の値を取得する必要があるモデル オブジェクトを表す も受け取ります。このドキュメント コンテキストは、Jackson を使用してモデル オブジェクトをシリアル化し、JsonPath ライブラリを使用して再読み取りすることによって作成されます。このようにして、テンプレートに挿入されるすべてのトークンが有効な JSON トークンであることが保証されます。

述語が変数を見つけると、含まれている JsonPath 式を抽出し、提供された値で新しい値を探しDocumentContext、元の JSON の値をオーバーライドします。

于 2015-11-15T20:59:30.167 に答える