0

我有以下java对象:

Record.class
    {
        long version;
        String data;
        String source;
    }

我正在尝试使用该data字段并使用对象映射器将其转换为 Java 类。

data = "{
        \"myUuid\": \"af34b6ab-bebc-443b-af5c-53495905cb0b\",
        \"location\": \"UK\",
        \"clientName\": \"My_ClientName\",
        \"status\": \"SUCCESS\",
        \"activeDays\": 251
    }";

我对应的Java类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ClientInfo implements TargetEntity {
    
    @JsonAlias("clientName")
    @JsonProperty("clientAccountId")
    String clientName;
    
    @JsonAlias("location")
    @JsonProperty("geo")
    String geo;
    
    @JsonAlias("status")
    @JsonProperty("clientStatus")
    String status;

    @JsonAlias("activeDays")
    @JsonProperty("numberOfDaysActive")
    int activeDays;

    @Override 
    public String getEntityName() {
        return "ClientInfo";
    }

    @Override public boolean isActiveForAtleast1Day() {
        return activeDays>0;
    }

}

最后我使用的代码:

  protected void buildClientInfo(Record clientRecord) {
        String data =  crmRecord.getData();
        ObjectMapper objectMapper = new ObjectMapper();
        ClientInfo entityData = objectMapper.readValue(data, ClientInfo.class);

    }

我的输出始终是 ObjectMapper 无法读取其他值。

{
"activeDays" : 0
}

使用 jackson-databind-2.9.x

我错过了什么?奇怪的是 - 如果我这样做了,new Gson().fromJson(clientRecord.getData(), clazz)我会得到我需要的输出,除了isActiveForAtleast1Day.

4

1 回答 1

0

发布此代码仅供参考:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ClientInfo implements TargetEntity {
    
    @JsonAlias("clientName")
    @JsonProperty("clientAccountId")
    String clientName;
    
    @JsonAlias("location")
    @JsonProperty("geo")
    String geo;
    
    @JsonAlias("status")
    @JsonProperty("clientStatus")
    String status;

    @JsonAlias("activeDays")
    @JsonProperty("numberOfDaysActive")
    int activeDays;

    @Override
    public String getEntityName() {
        return "ClientInfo";
    }

    @Override
    public boolean isActiveForAtleast1Day() {
        return activeDays>0;
    }
// getters/setters
}

// assumption
public interface TargetEntity {

    String getEntityName();
    boolean isActiveForAtleast1Day();
}

测试代码:

String data = "{\"myUuid\": \"af34b6ab-bebc-443b-af5c-53495905cb0b\",\"location\": \"UK\",\"clientName\": \"My_ClientName\",\"status\": \"SUCCESS\",\"activeDays\": 251}";

ObjectMapper objectMapper = new ObjectMapper();
ClientInfo entityData = objectMapper.readValue(data, ClientInfo.class);
      
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(entityData));

输出:

{
  "entityName" : "ClientInfo",
  "activeForAtleast1Day" : true,
  "clientAccountId" : "My_ClientName",
  "geo" : "UK",
  "clientStatus" : "SUCCESS",
  "numberOfDaysActive" : 251
}
于 2020-06-28T11:26:04.300 回答