将grails域对象转换为JSON并对其进行操作

时间:2014-01-21 10:43:50

标签: json grails

我有一个使用def json = object as JSON转换的grails对象。在我转换之后,我想再向JSON添加一个名为pin的属性,如下所示。

[location:[lat:23.03, lon:72.58]]

到目前为止,只有这样做的方法似乎如下

  1. 使用grails.converters.json
  2. 将DomainClass序列化为JSON
  3. 将JSON转换为字符串
  4. 使用步骤2中的字符串
  5. 创建JSONBoject
  6. 添加属性
  7. 将其转换回String
  8. 使用grails.converters.json执行此操作的其他任何方法?我尝试过使用Gson,但我不想去那条路,因为我收到很多循环引用错误

2 个答案:

答案 0 :(得分:1)

试试这个:

domainInstance.properties + [pin: pinInstance] as JSON

答案 1 :(得分:0)

我最近需要做类似的事情。一些警告:

  • 这是使用Grails 2.4.5
  • 我使用MongoDB作为后端。因此,我为MongoDB域类创建了一个对象marshaller。它打印在下面,你可以为你的域类包装一个类似的编组器:

的Marshaller:

class MongodbObjectMarshaller implements ObjectMarshaller<JSON> {
    @Override
    boolean supports(Object o) { return o?.properties?.dbo }

    @Override
    void marshalObject(Object obj, JSON converter) throws    
    ConverterException {

        Map propertiesToOutput = obj.properties.dbo

        propertiesToOutput.remove("_id")  //don't print org.bson.types.ObjectId
        propertiesToOutput.remove("version")  //don't print gorm verson column

        converter.build {
            _id obj.id.toString()
            propertiesToOutput.each{ entry ->
                "$entry.key" entry.value
            }
        }

    }
}

marshaller做了什么,它允许在JSON输出任何域类的属性。 obj.properties.dbo对于MongoDB来说是特殊的,但对于常规域类,您只需抓取属性并排除您不需要的属性。

然后在我的控制器中,这有效:

domainInstance.pin = [location:[lat:23.03, lon:72.58]]
def content = tacticalCard as JSON

因为我的编组现在拿起了pin属性并将其打印出来。