使用Jackson 2.9.6

时间:2018-08-06 12:38:45

标签: java jackson jersey jackson2

我有一个具有以下模式的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;
}

有人可以帮我解决吗?我正在使用球衣+杰克逊。

2 个答案:

答案 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);