Groovy通过Jackson将Map转换为POJO,抱怨没有属性
我正在尝试将一个映射从http响应转换为POJO。答案是Groovy通过Jackson将Map转换为POJO,抱怨没有属性,groovy,jackson,Groovy,Jackson,我正在尝试将一个映射从http响应转换为POJO。答案是 {_total=0} 在我的Pojo中,我想去掉下划线,所以我用@JsonProperty注释了字段。但是Groovy抱怨没有total属性 堆栈跟踪 org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{_total=0}' with class 'java.util.LinkedHashMap' to class 'io.
{_total=0}
在我的Pojo中,我想去掉下划线,所以我用@JsonProperty注释了字段。但是Groovy抱怨没有total属性
堆栈跟踪
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{_total=0}' with class 'java.util.LinkedHashMap' to class 'io.toro.linkedin.response.CompanyAdminsResponse' due to: org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: _total for class: io.toro.linkedin.response.CompanyAdminsResponse
Possible solutions: total
at io.toro.linkedin.connector.LinkedInConnector.linkedInListCompaniesThatUserIsAdminOf(LinkedInConnector.groovy:314)
at LinkedInTest.list-companies-that-user-is-admin-of(LinkedInTest.groovy:115)
转换码
HttpResponseDecorator response = restClient.get(params)
ObjectMapper mapper = new ObjectMapper()
mapper.convertValue(response.data as Map, T)
波乔
包io.toro.linkedin.response
导入com.fasterxml.jackson.annotation.JsonProperty
导入groovy.transform.ToString
导入io.toro.linkedin.model.Company
/**
*@作者丹尼尔·戈麦斯
*/
@ToString(includeNames=true)
类别CompanyAdminResponse{
@JsonProperty(“U计数”)
整数计数
@JsonProperty(“U开始”)
整数开始
@JsonProperty(“总计”)
整数总计
列表值
}
我认为问题来自对Map
的响应转换:response.data as Map
,您正在将其传递给mapper.convertValue
方法
我直接使用followMap
[\u total:3]
生成一个groovy脚本来测试您的问题,在正确创建对象时不会引发异常:
@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-annotations:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-databind:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import groovy.transform.ToString
class Company {
}
@ToString(includeNames = true)
class CompanyAdminsResponse {
@JsonProperty('_count')
int count
@JsonProperty('_start')
int start
@JsonProperty('_total')
int total
List<Company> values
}
ObjectMapper mapper = new ObjectMapper()
def object = [_total : 3]
println mapper.convertValue(object, CompanyAdminsResponse)
// the above line prints CompanyAdminsResponse(count:0, start:0, total:3, values:null)
@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson注释:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson数据绑定:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')
导入com.fasterxml.jackson.annotation.JsonProperty
导入com.fasterxml.jackson.databind.ObjectMapper
导入groovy.transform.ToString
阶级公司{
}
@ToString(includeNames=true)
类别CompanyAdminResponse{
@JsonProperty(“U计数”)
整数计数
@JsonProperty(“U开始”)
整数开始
@JsonProperty(“总计”)
整数总计
列表值
}
ObjectMapper映射器=新的ObjectMapper()
def object=[[总计:3]
println mapper.convertValue(对象,CompanyAdminResponse)
//上行打印CompanyAdminResponse(计数:0,开始:0,总计:3,值:null)
希望这能有所帮助,如果您去掉了toString注释,它能工作吗?不,它也不能工作。
@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-annotations:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-databind:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import groovy.transform.ToString
class Company {
}
@ToString(includeNames = true)
class CompanyAdminsResponse {
@JsonProperty('_count')
int count
@JsonProperty('_start')
int start
@JsonProperty('_total')
int total
List<Company> values
}
ObjectMapper mapper = new ObjectMapper()
def object = [_total : 3]
println mapper.convertValue(object, CompanyAdminsResponse)
// the above line prints CompanyAdminsResponse(count:0, start:0, total:3, values:null)