2017-07-15 5 views
0

我々はGrailsの3.3のGrails 3.3は、壊れたJSONをレンダリング?

で動作するようにGrails 2.5のプロジェクト私たちは、JSON APIを持って、thusly JSONで応答すなわちcontolersを取得しようとしている。

  log.info("about to return json") 
      render(status: 200, contentType: 'application/json') { 
       [ 
        'result': 9999, 
        'message': "hello" 
       ] 
      } 

問題が出プットが常にあるということです"{}"。これはコントローラメソッドの最後のコードです。我々はこれを行う場合は

render("hello") 

私たちは "hello" を取得します。

我々が行う場合:

render(status: 200, contentType: 'application/json') { 
        result = 0 
        player = "hello" 
      } 

我々はまた、常に狂気思われる "} {{" を取得します!

アイデア?これはgrails 3.3で壊れていますか?この同じコードはGrailsの2.5

で完璧に動作現在、我々は見つけることができる唯一のソリューションは、退屈でエラーが発生しやすくなり、文字列の連結を使用して、手でJSONをレンダリングすることです。

答えて

0

は、ソースコードを踏み込んで、Grailsの3がStreamingJsonBuilderにボンネットの下にJSONのレンダリングを担当するクラスを変更したようです。これは、わずかに異なる構文を持ち、既存の2.5のコードを破っています。残念なことに、レンダリングのドキュメントと例にはまだ "古い"形式があります。

2つのオプションがあります。

1例えば、新しい形式を使用します。

render(status: 200, contentType: 'application/json') { 
     result 0 
     player "hello" 
} 

これの欠点は、カスタムオブジェクトマーシャラーで動作doesntのことですが。

2使用JSONBuilder、例えば

def builder = new JSONBuilder() 
def json = builder.build { 
     result= "0" 
     player= "hello" 
} 
render(status: 200, contentType: 'application/json', text: json) 

これには2つの利点があります。それは、Grailsの2.5および3.xで動作しますので、Grailsの4.xのでも動作しますまた、多くのコードを保存するObject Marshallersで動作します。

カスタムオブジェクトマーシャラーは、次のようになります。

DecimalFormat df = new DecimalFormat("##0.00"); 
    JSON.registerObjectMarshaller(Account) { 
     return [balance: df.format(it.balance), currencyIso: it.currencyIso, id: it.id] 
    } 

、あなたが(INITへのconfから移動および3.xで異なるパッケージを与えられた)あなたのbootstrap.groovyに入れ

関連する問題