Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将grails域对象转换为JSON并对其进行操作_Json_Grails - Fatal编程技术网

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

将grails域对象转换为JSON并对其进行操作,json,grails,Json,Grails,我有一个grails对象,我正在使用defjson=objectasjson转换它。转换后,我想在JSON中再添加一个名为pin的属性,如下所示 [location:[lat:23.03, lon:72.58]] 到目前为止,唯一能做到这一点的方法似乎如下 使用grails.converters.JSON将DomainClass序列化为JSON 将JSON转换为字符串 使用步骤2中的字符串创建JSONBoject 添加属性 将其转换回字符串 使用grails.converters.json还有

我有一个grails对象,我正在使用
defjson=objectasjson
转换它。转换后,我想在JSON中再添加一个名为
pin
的属性,如下所示

[location:[lat:23.03, lon:72.58]]
到目前为止,唯一能做到这一点的方法似乎如下

  • 使用grails.converters.JSON将DomainClass序列化为JSON
  • 将JSON转换为字符串
  • 使用步骤2中的字符串创建JSONBoject
  • 添加属性
  • 将其转换回字符串
  • 使用grails.converters.json还有其他方法吗?我尝试过使用Gson,但我不想走这条路,因为我遇到了许多循环引用错误

    请尝试以下方法:

    domainInstance.properties + [pin: pinInstance] as JSON
    

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

    • 这是在使用Grails2.4.5
    • 我使用MongoDB作为后端。因此,我为MongoDB域类创建了一个对象封送器。它打印在下面,您可以为您的域类包装一个类似的封送拆收器:
    马歇尔:

    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
                }
            }
    
        }
    }
    

    因为我的封送员现在提取pin属性并打印它。

    这会将pin添加为域实例的一部分吗?不会。但是您真的需要将域与其他字段合并吗?如果是这样,也许将此字段添加到域类会更好?或者在其中创建一个代理字段,为
    pin
    提供一个getter?这是我第一次尝试,我在域类中添加了lat和lon,并创建了
    public getPin(){['location':[lat:lat,lon:lon]}
    方法,但当我将
    对象作为JSON
    时,pin不在JSON的字符串表示形式中。Had查看了
    org.codehaus.groovy.grails.web.converters.marshaller.JSON.DomainClassMarshaller
    的源代码,发现只有域类的持久属性被封送到JSON。因此,获取具有自定义结构的JSON的最直接的方法是创建一个映射并对其进行编组?
    domainInstance.pin = [location:[lat:23.03, lon:72.58]]
    def content = tacticalCard as JSON