GrailsJSON编组

GrailsJSON编组,json,grails,Json,Grails,我有一个域对象,它与另一个域对象有1-M关系,例如 人员1->M语言 我已经注册了一个JSON对象封送器来封送Person对象。我正在处理的一个用例是以表格格式显示Person,默认情况下显示的是主要语言 我遇到的问题是,当用户生成语言搜索时,我希望为该用户显示匹配的语言,而不是主要语言 我遇到的问题是,我不知道如何访问在对象封送器中搜索的语言,因此我无法确定要在JSON中呈现的表格格式的匹配语言 以下是我为此人提供的示例代码: JSON.registerObjectMarshaller(Per

我有一个域对象,它与另一个域对象有1-M关系,例如

人员1->M语言

我已经注册了一个JSON对象封送器来封送Person对象。我正在处理的一个用例是以表格格式显示Person,默认情况下显示的是主要语言

我遇到的问题是,当用户生成语言搜索时,我希望为该用户显示匹配的语言,而不是主要语言

我遇到的问题是,我不知道如何访问在对象封送器中搜索的语言,因此我无法确定要在JSON中呈现的表格格式的匹配语言

以下是我为此人提供的示例代码:

JSON.registerObjectMarshaller(Person) {  

 def returnArray = [:]
    returnArray['id'] = it.id
    returnArray['name'] = it.displayName?:""
    //I would like to be able to get the language matching a search param here
    //when a search has been carried out
    returnArray['language'] = it.primaryLanguage?:""

  }
目前,我的解决方法是使用PersonWrapper,在构造函数中传递搜索词,为包装注册对象封送器,并在包装中进行过滤

这对我来说是相当浪费的,因为我需要迭代我的域结果并为每个实例创建一个包装器


任何建议都将不胜感激。

对于这样一个常见的用例来说,听起来非常复杂。您可以使用条件搜索您的人员和相应的语言,然后将结果转换为适当的json格式。e、 g

def result = Person.createCriteria().list {
   language {
      eq("lang", "de") // could be your search term
   }
} // you can also use hql to achieve our requirement

def json = []

result.each {
    json << [id: result.id, name: result.name, ...]
}

render json as JSON
def result=Person.createCriteria().list{
语言{
eq(“lang”,“de”)//可能是您的搜索词
}
}//您也可以使用hql来实现我们的要求
def json=[]
结果,每个{

json对于这样一个常见的用例来说听起来非常复杂。您可以使用条件搜索您的人员和相应的语言,然后将结果转换为适当的json格式

def result = Person.createCriteria().list {
   language {
      eq("lang", "de") // could be your search term
   }
} // you can also use hql to achieve our requirement

def json = []

result.each {
    json << [id: result.id, name: result.name, ...]
}

render json as JSON
def result=Person.createCriteria().list{
语言{
eq(“lang”,“de”)//可能是您的搜索词
}
}//您也可以使用hql来实现我们的要求
def json=[]
结果,每个{

json也许您正在寻找类似的东西:

def filterLang = Language.findByCode("de")

// search for persons having the filter language assigned
def foundPersons = Persong.executeQuery("select p from Person as p inner join p.languages as lang where lang = :filterLang",[filterLang : filterLang])

def json = []

foundPersons .each {
    json << [id: it.id, name: it.name, language: filterLang]
}

render json as JSON
def filterLang=Language.findByCode(“de”)
//搜索指定了筛选语言的人员
def foundPersons=Persong.executeQuery(“从Person中选择p作为p内部连接p.languages作为lang,其中lang=:filterLang”,[filterLang:filterLang])
def json=[]
每个人{

json也许您正在寻找类似的东西:

def filterLang = Language.findByCode("de")

// search for persons having the filter language assigned
def foundPersons = Persong.executeQuery("select p from Person as p inner join p.languages as lang where lang = :filterLang",[filterLang : filterLang])

def json = []

foundPersons .each {
    json << [id: it.id, name: it.name, language: filterLang]
}

render json as JSON
def filterLang=Language.findByCode(“de”)
//搜索指定了筛选语言的人员
def foundPersons=Persong.executeQuery(“从Person中选择p作为p内部连接p.languages作为lang,其中lang=:filterLang”,[filterLang:filterLang])
def json=[]
每个人{

json您可以选择过滤查询并准备呈现:

import org.hibernate.criterion.CriteriaSpecification

List list = Person.withCriteria {
  maxResults 5
  resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
  alias 'languages', 'lan'
  projections {
    property 'id', 'id'
    property 'displayName', 'name'
    property 'lan.language', 'language'
  }
  eq 'lan.language', 'FR'    
}
然后您可以使用结果

render list as JSON
您必须使用
resultTransformer
并为每个
属性设置
别名
。这样您就可以为特定情况创建自定义渲染


注意:这段代码还没有经过测试,只是一个粗略的想法。

您可以过滤查询并准备呈现:

import org.hibernate.criterion.CriteriaSpecification

List list = Person.withCriteria {
  maxResults 5
  resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
  alias 'languages', 'lan'
  projections {
    property 'id', 'id'
    property 'displayName', 'name'
    property 'lan.language', 'language'
  }
  eq 'lan.language', 'FR'    
}
然后您可以使用结果

render list as JSON
您必须使用
resultTransformer
并为每个
属性设置
别名
。这样您就可以为特定情况创建自定义渲染


注意:这段代码没有经过测试,只是一个粗略的想法。

thx。我的查询是以这种形式进行的,问题是当我从hibernate将用户恢复时,所有语言都被加载了,因为我真的只想筛选匹配的语言以呈现给最终用户。thx就是这样。我的查询是以那种形式进行的,这就是问题所在就是当我从hibernate把这个人带回来时,所有的语言都被加载了,因为我真的只想过滤匹配的语言来呈现给最终用户。