Grails: обратный вызов JSONP без идентификатора и класса в файле JSON - PullRequest
3 голосов
/ 09 ноября 2009

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

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

Файл Json, поступающий к клиенту, включал в себя все атрибуты, включая id и class , которые я не хочу иметь там. Если это не jsonp, я делаю это так, и это прекрасно работает:

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

Так как мне получить атрибуты id и class из json при рендеринге "user as JSON"? Есть идеи?

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

Ответы [ 3 ]

5 голосов
/ 09 ноября 2009

Вы можете избавиться от свойств класса и id в результате 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-app / conf / BootStrap.groovy:

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

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

2 голосов
/ 11 ноября 2009

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

Чувак, в конце концов, все выглядит так просто, и так долго не могли понять. Я работал, создавая карту из нужных мне значений, и рендерил их «как json» следующим образом:

def userProfile = user.get (randomUser)

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

println jsonData

вуаля, был json, который мне был нужен:)

0 голосов
/ 09 ноября 2009

Мне не кажется, что это поддерживает JSON auto marshaller.

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

...