2013-05-25 22 views
5

Bugün bu garip sonucu karşınıza çıkartarak Grails 2.0.4'te JSON olarak bir nesne listesi oluşturmaya çalışıyorum. (Biliyorum, sormaktan pişman olacağım. burnumun altında bir şey yüzünden ... güncelleştirildi 5/26, benim tahminim doğru, aşağıya bakın :-))Koşullu işleçle Grails'de 'JSON olarak düzenleme' doğru şekilde görüntülenmiyor

Bu iyi çalışıyor; JSON

def products = [] //ArrayList of Product objects from service  
def model = (products) ? [products:products] : [products:"No products found"] 
render model as JSON 

..Bu yüzden ... tarayıcıda şekilde oluşturuluyor; neden model iş olmadan bu kısaltılmış versiyonu?

def products = []  
render ((products) ? [products:products] : [products:"No products found"]) as JSON 

Yukarıdaki kod kaynaklanan JSON tek bir metin satırı olarak çıktı, bu yüzden o kadar as JSON açmıyor şüpheli, ancak doğru parantez, bu yüzden anlaşma nedir?

[ 'ürünler': [com.test.domain.Product: null, com.test.domain.Product ...]

cevap

8

Bu render normal bir davranıştır. Eğer

render model as JSON

gibi parantez olmadan render argümanlar sağladığınızda O text/json için content-type kurma örtük bir ayarlama yapar. Ama daha sonra durumda, bilmeden

render ((products) ? [products:products] : [products:"No products found"]) as JSON [render kullanacağım Normal render() hale yapar sonra ilk ayraç üzerinde işareti] gibi parantez kullanmak render yaptık. Yukarıdaki durumda

, sen söz render için adlandırılmış parametreleri geçmek zorunda contentType, text veya model, status vb tarayıcıda JSON olarak satır içi kontrol mantığını işlemek amacıyla Yani/sizin gibi yapmak zorunda görmek aşağıda:

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON) 

Ayrıca text/json olarak content-type kullanabilirsiniz. application/json'u tercih ederim.

GÜNCELLEME
Alternatif En basit yol:
render([products: (products ?: "No products found")] as JSON)

+0

Kahretsin ı) (işlemek 'hatırlatıyorum söylemek parantez fazladan bir dizi gerekir nedeni budur' bile farkında olmadan, thx, senin çözümün bu kullanarak elemanları ile gidiş sona erdi, şey biraz daha kısa ve içerik türünü iki kez belirtmekten kaçınıyor: "render (contentType:" text/json ") {[products: (products?:" Ürün bulunamadı ")]}' – raffian

+4

Bu da işe yarayacak: render ((ürünler) ? [ürünler: ürünler]: [ürünler: "Ürün bulunamadı"]) JSON olarak) –

+0

@JamesKleeh Ace delikte, güzel! .. ve tam olarak aradığım şey! – raffian

1

nedenini bilmiyorum. Böyle kullanmayı deneyin:

render(contentType: 'text/json') {[ 
    'products': products ? : "No products found" 
]} 
1

Ne sonuca "JSON olarak" parametreler() ile işlemek çağırarak, ardından uyguluyor yok!

Parantezleri dışarıda bırakmanın bir yöntem çağrısı için yalnızca bir kısayol olduğunu unutmayın, ancak aynı kurallar hala geçerlidir.

3

burada Sorunun özü harika derleyici

render x as JSON 

render (x as JSON) 

olarak algılanır olmasıdır ama

render (x) as JSON 

olarak algılanır

(render x) as JSON 

Bir yöntem adı (bu durumda render) hemen bir açılış parantezi tarafından izlenirse, o zaman yalnızca eşleşen kapama parantezine kadar kodlama argüman listesi olarak kabul edilir. Eğer

render ((x) as JSON) 
İlgili konular