在将对象转换为json

时间:2017-08-26 21:56:29

标签: java json groovy jackson

我正在为工作中的某个功能编写一些后端测试,并且显然卡在了一些似乎很容易在纸上解决但却无法弄清楚如何使其工作的事情>。>。

这是我正在做的一个例子。

这就是我需要JSON的结果:

{
    "application.properties.service": {
        "properties": {
            "test": "property"
        }
    }
}

这是我为编写该请求而编写的2个Groovy类:

class Configuration {

    private ApplicationPropertiesService applicationPropertiesService

    Configuration() {

    }

    @JsonProperty("application.properties.service")
    ApplicationPropertiesService getApplicationPropertiesService() {
        return applicationPropertiesService
    }

    void setApplicationPropertiesService(ApplicationPropertiesService applicationPropertiesService) {
        this.applicationPropertiesService = applicationPropertiesService
    }
}

-

class ApplicationPropertiesService {

    private Map properties

    ApplicationPropertiesService() {
        this.properties = new HashMap()
    }

    ApplicationPropertiesService(Map properties) {
        this.properties = properties
    }

    Map getProperties() {
        return properties
    }

    void setProperties(Map properties) {
        this.properties = properties
    }

    void addProperty(String key, String value) {
        this.properties.put(key, value)
    }
}

这是我正在尝试的测试:

@Test
void "test"() {
    ApplicationPropertiesService  appPropServ = new ApplicationPropertiesService()
    appPropServ.addProperty("test", "property")
    Configuration testConfig = new Configuration()
    testConfig.setApplicationPropertiesService(appPropServ)

    println new JsonBuilder(testConfig).toPrettyString()
}

但当然我最终得到的是:

{
    "applicationPropertiesService": {
        "properties": {
            "test": "property"
        }
    }
}

所以我无法弄清楚如何覆盖名称,以便在将其解析为JSON时,它将由.而不是像现在这样的驼峰案例分开。 从我一直在阅读@JsonProperty("application.properties.service")包中的注释jackson.annotation应该完全按照我想要的那样做,但我尝试将它放在属性的getter之前,然后将它放在属性声明的开头在这两种情况下它似乎都忽略了它。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

这不是JsonProperty问题,而是因为代码

Configuration(ApplicationPropertiesService applicationPropertiesService) {
    this.applicationPropertiesService = applicationPropertiesService
}

因此,Configuration中没有默认构造函数,这使得jackson无法创建Configuration对象。 (它使用反射,并且不知道要使用的特定构造函数。因此它使用默认构造函数。)

尝试添加

Configuration() {

}

Configuration课程。

更新:您不应将杰克逊ObjectMapper与内置于JsonBuilder的Groovy混合使用。

    ApplicationPropertiesService appPropServ = new ApplicationPropertiesService()
    appPropServ.addProperty("test", "property")
    Configuration testConfig = new Configuration()
    testConfig.setApplicationPropertiesService(appPropServ)
     println new ObjectMapper().writeValueAsString(testConfig)

输出:

{"application.properties.service":{"properties":{"test":"property"}}}

答案 1 :(得分:1)

如果你正在寻找一个基于时间的解决方案,那么这简单吗? 代码是数据,数据是代码。

import groovy.json.JsonBuilder
import groovy.json.JsonOutput

def json = new JsonBuilder()
json.'application.properties.service' {
  properties {
    test 'property'
  }
}

println JsonOutput.prettyPrint(json.toString())

assert '{"application.properties.service":{"properties":{"test":"property"}}}'  == json.toString()

您可以在线快速尝试 demo