我有一个具有以下模式的REST服务:
/**
* Agent
*/
public class Agent {
@JsonProperty("name")
private String name = null;
@JsonProperty("type")
private String type = null;
@JsonProperty("description")
private String description = null;
@JsonProperty("status")
private String status = null;
@JsonProperty("meta")
private Object meta = null;
@JsonProperty("Operations")
private List<OperationsListInner> operations = null;
@JsonProperty("Properties")
private List<Object> properties = null;
public Agent name(String name) {
this.name = name;
return this;
}
/**
* Get name
* @return name
**/
@JsonProperty("name")
@ApiModelProperty(required = true, value = "")
@NotNull
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Agent type(String type) {
this.type = type;
return this;
}
/**
* Get type
* @return type
**/
@JsonProperty("type")
@ApiModelProperty(value = "")
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Agent description(String description) {
this.description = description;
return this;
}
/**
* Get description
* @return description
**/
@JsonProperty("description")
@ApiModelProperty(value = "")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Agent status(String status) {
this.status = status;
return this;
}
/**
* Get status
* @return status
**/
@JsonProperty("status")
@ApiModelProperty(value = "")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Agent meta(Object meta) {
this.meta = meta;
return this;
}
/**
* Get meta
* @return meta
**/
@JsonProperty("meta")
@ApiModelProperty(value = "")
public Object getMeta() {
return meta;
}
public void setMeta(Object meta) {
this.meta = meta;
}
public Agent operations(List<OperationsListInner> operations) {
this.operations = operations;
return this;
}
public Agent addOperationsItem(OperationsListInner operationsItem) {
if (this.operations == null) {
this.operations = new ArrayList<>();
}
this.operations.add(operationsItem);
return this;
}
/**
* Get operations
* @return operations
**/
@JsonProperty("fetchOperations")
@ApiModelProperty(value = "")
public List<OperationsListInner> getOperations() {
return operations;
}
public void setOperations(List<OperationsListInner> operations) {
this.operations = operations;
}
public Agent properties(List<Object> properties) {
this.properties = properties;
return this;
}
public Agent addPropertiesItem(Object propertiesItem) {
if (this.properties == null) {
this.properties = new ArrayList<>();
}
this.properties.add(propertiesItem);
return this;
}
/**
* Get properties
* @return properties
**/
@JsonProperty("Properties")
@ApiModelProperty(value = "")
public List<Object> getProperties() {
return properties;
}
public void setProperties(List<Object> properties) {
this.properties = properties;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Agent agent = (Agent) o;
return Objects.equals(this.name, agent.name) &&
Objects.equals(this.type, agent.type) &&
Objects.equals(this.description, agent.description) &&
Objects.equals(this.status, agent.status) &&
Objects.equals(this.meta, agent.meta) &&
Objects.equals(this.operations, agent.operations) &&
Objects.equals(this.properties, agent.properties);
}
@Override
public int hashCode() {
return Objects.hash(name, type, description, status, meta, operations, properties);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Agent {\n");
sb.append(" name: ").append(toIndentedString(name)).append("\n");
sb.append(" type: ").append(toIndentedString(type)).append("\n");
sb.append(" description: ").append(toIndentedString(description)).append("\n");
sb.append(" status: ").append(toIndentedString(status)).append("\n");
sb.append(" meta: ").append(toIndentedString(meta)).append("\n");
sb.append(" operations: ").append(toIndentedString(operations)).append("\n");
sb.append(" properties: ").append(toIndentedString(properties)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}
现在,当我尝试将此模式放入REST客户端时,出现冲突的属性名称错误。这是在我的GET http请求中发生的。
Exception in thread "main" java.lang.IllegalStateException: Conflicting/ambiguous property name definitions (implicit name 'operations'): found multiple explicit names: [Operations, fetchOperations], but also implicit accessor: [method com.agentsDB.api.model.individualAgents.Agent#setOperations(1 params)][visible=true,ignore=false,explicitName=false]
at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder._explode(POJOPropertyBuilder.java:1062)
at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.explode(POJOPropertyBuilder.java:1043)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._renameProperties(POJOPropertiesCollector.java:798)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:324)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:287)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:170)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:346)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:330)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:255)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:214)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:137)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:411)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4178)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3997)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)
at com.agentsDB.api.JsonUtil.convertJSONtoJAVA(JsonUtil.java:34)
at com.agentsDB.api.apiClientInvoke.invokeAPI(apiClientInvoke.java:54)
at com.agentsDB.api.main.main(main.java:25)
我已经阅读了很多有关这方面的文章,但是找不到任何解决方案。我使用的是JACKSOn 2.9.6,我的JsonUtil如下,用于序列化和反序列化。
public class JsonUtil {
private static ObjectMapper mapper;
static {
mapper = new ObjectMapper();
}
public String convertJAVAtoJSON(Object object){
String JSONresult = "";
try{
JSONresult = mapper.writeValueAsString(object);
} catch (JsonProcessingException e){
System.out.println("exception occured");
e.printStackTrace();
}
return JSONresult;
}
public <T> T convertJSONtoJAVA(String jsonString, Class<T> returnTypeClass){
T javaResult = null;
try {
javaResult = mapper.readValue(jsonString,returnTypeClass);
}catch(IOException e){
e.printStackTrace();
}
return javaResult;
}
有人可以帮我解决吗?我正在使用球衣+杰克逊。
答案 0 :(得分:0)
您应将using System.Dynamic;
using System.Web.Script.Serialization;
using System.IO;
using System.Collections;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var ictionarys = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(value);
foreach (var item in ictionarys)
{
List<object> itemList = new List<object>();
foreach (var item2 in (ICollection)item.Value)
{
//Here how to code
}
Console.WriteLine(item.Key + "=> " + item.Value);
}
更改为@JsonProperty("fetchOperations")
。
答案 1 :(得分:0)
好了,我找到了答案的解决方案。最后!!首先,我必须从所有方法(getter和setter)中删除所有@JsonProperty
。现在,只有班级中的字段由@JsonProperty
注释。
然后必须在Objectmapper
对象中添加配置行。
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);