2009-11-09 3 views
3

Я работаю над интерфейсом REST, где люди получают json-файл. Клиент должен получить доступ к файлу из другого домена. Я использую jsonp, который работает до сих пор. Моя проблема заключается в рендеринге в Grails. На данный момент я использую «как JSON» на упорядочивание объекта:Grails: обратный вызов JSONP без id и класса в файле JSON

render "${params.jsoncallback}(${user as JSON})" 

Файл Json получает клиент inclused всех атрибутов, incluing в идентификаторе и класса, который я не хочу иметь там. В случае, если это не JSONP, я сделать это таким образом, который прекрасно работает:

render(contentType:'text/json'){ 
    userName user.userName 
    userImage user.userImage 
    : 
    : 
} 

Так как я могу получить идентификатор и атрибуты класса из JSON при просчете «пользователя как JSON»? Есть идеи?

наилучшими пожеланиями, Клаас

+0

Пожалуйста, проверьте [здесь] (http://www.intelligrape.com/blog/2010/05/13/create-json-object -using-grails-converter-only-selective-fields-from-lists-of-objects /) для рендеринга выборочных полей в ответе JSON –

ответ

0

Это не кажется мне, как если авто маршаллер JSON это поддерживает.

Вы можете использовать FlexJSON, что позволяет исключить определенные свойства и обернуть их в custom Codec. Также см. here.

5

Вы можете избавиться от свойств класса и идентификатора в результате JSON, создав собственный объект ObjectMarshaller.

// CustomDomainMarshaller.groovy in src/groovy: 
import grails.converters.JSON; 
import org.codehaus.groovy.grails.web.converters.ConverterUtil; 
import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException; 
import org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller; 
import org.codehaus.groovy.grails.web.json.JSONWriter; 
import org.springframework.beans.BeanUtils; 

public class CustomDomainMarshaller implements ObjectMarshaller<JSON> { 

    static EXCLUDED = ['metaClass','class','id','version'] 

    public boolean supports(Object object) { 
     return ConverterUtil.isDomainClass(object.getClass()); 
    } 

    public void marshalObject(Object o, JSON json) throws ConverterException { 
     JSONWriter writer = json.getWriter(); 
     try { 
      writer.object(); 
      def properties = BeanUtils.getPropertyDescriptors(o.getClass()); 
      for (property in properties) { 
       String name = property.getName(); 
       if(!EXCLUDED.contains(name)) { 
        def readMethod = property.getReadMethod(); 
        if (readMethod != null) { 
         def value = readMethod.invoke(o, (Object[]) null); 
         writer.key(name); 
         json.convertAnother(value); 
        } 
       } 
      } 
      writer.endObject(); 
     } catch (Exception e) { 
      throw new ConverterException("Exception in CustomDomainMarshaller", e); 
     } 
    } 
} 

Вам нужно зарегистрироваться в вас Grails-приложение/CONF/BootStrap.groovy:

class BootStrap { 
    def init = { servletContext -> 
     grails.converters.JSON.registerObjectMarshaller(new CustomDomainMarshaller()) 
    } 
    def destroy = {} 
} 

Это должно работать в Grails> = 1,1

+0

Работает как шарм в 1.3.7! Отличная работа! –

+0

Это, похоже, не работает из тестов модулей контроллера. Есть идеи? –

+0

Я думаю, что определение DTO с только свойствами, которые вы хотите в ответ, может быть проще. Затем просто отрисуйте DTO как JSON. – erturne

2

спасибо за 'быстрый' Ответить!

Человек, в конце концов, это выглядит так просто и так долго нужно было выяснить. я получил это работает делает карту из значений I, необходимых и оказываемых им 'как JSON', как это:

Защиту Userprofile = user.get (RandomUser)

Защиту jsonData = [
имя пользователя: Userprofile .userName,
userimage: userProfile.userImage,
userstreet: userProfile.userStreet,
:
:
], как JSON

Println jsonData

вуаля, был мне нужен JSON :)