2016-07-04 6 views
0

Grails REST APIプロジェクトでは、デフォルトでGrailsはプロパティを読み込み、ラクダケース(camelCase)と仮定してプロパティをレンダリングします。しかし、多くの一般的なREST APIでは、スネークケース(snake_case)でパラメータの名前が標準化されています。 Grailsでこの自動変換を最も効果的に有効にするにはどうすればよいですか?Grails REST APIでSnakeケースをキャメルケースに自動変換しますか?

たとえば、リクエスト本体では、スネークケースの入力を受け入れたいと思います。

{ 
    "first_name": "John" 
} 

レスポンスボディでは、ヘビケース出力を送信したいと思います。

{ 
    "last_name": "Doe" 
} 

しかし、私はキャメルケースとGroovyの自動生成ゲッターとセッターを使用して、GrailsのではGroovyの慣習に従った合理私のドメインクラスを維持したいです。

class User { 
    String firstName 
    String lastName 
} 

私はMongoDBスキーマを変更しないでください。ここでは、99%のフィールドにcamelCaseという名前が付けられています。しかし、少なくともin the MongoDB docsであることがわかります.MongoDBフィールドにsnake_caseという名前を付けることをお勧めします。

Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create()

これは、あなたがテキストとしてあなたのリクエスト/レスポンスボディを取得し、に頼るべきではないことを意味します

答えて

0

あなたは/シリアライズあなたのクラスをデシリアライズし、フィールドの名前付けポリシーを設定するhttps://github.com/google/gsonを使用することができますGrailsが提供するautomagic jsonデシリアライズ。

もう1つの選択肢は、少なくともカスタムJSONマーシャラを登録することです。これはbootstrap.groovyで行うことができます。以下のサンプルコードでは、マーカーインターフェイスを実装しているため、スネークケースとしてシリアル化する必要があるオブジェクトを明示的に指定することができます。ドメインはあなたがヘビの場合は、JSONマーシャラーは区別がなされていること

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 

     JSON.registerObjectMarshaller(SnakeCase, { SnakeCase o -> 

      def result = [:] 
      if (grailsApplication.isDomainClass(o.class)) { 
       o.domainClass.persistentProperties.each { GrailsDomainClassProperty p -> 
        def name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, p.name) 
        result[name] = o[p.name] 
       } 
      } else { 
       o.properties.each { 
        def name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, it.key as String) 
       result[name] = it.value 
       } 
      } 

      return result 

     }) 
    } 

    def destroy = { 
    } 
} 

注意を登録されているbootstrap.groovyカスタムに続いて

class Person implements SnakeCase { 

    String surname 
    String firstName 
    String middleNames 
    String someOtherField 

    static constraints = { 
    } 
} 

このインタフェースを実装としてエクスポートするオブジェクト

interface SnakeCase { 
} 

grailsドメインクラスまたは通常のPOGOクラスの間どのプロパティがシリアル化されるかを細かく制御できるように、黒/白のリストメカニズムを追加することもできます。この例では、このマーシャラーが登録された後、実際のヘビのケーシング

を実行するためにグアバCaseFormatユーティリティを使用して、それはあなたのコントローラメソッドで

def ajaxListPeople() { 

    def list = Person.list(); 

    render(list as JSON) 
} 
JSONフォーマッタを使用しての問題です
関連する問題