我有一个用例,我必须对对象使用多态,因为这些是来自第三方服务器的响应。 这是我的回复课程之一:
@JsonTypeInfo(
use = JsonTypeInfo.Id.CLASS,
include = JsonTypeInfo.As.PROPERTY,
defaultImpl = RiderUpdate.class,
property = "@class")
@JsonIgnoreProperties(ignoreUnknown = true)
public class RiderUpdate implements Serializable {
@JsonProperty("status")
private RiderStatus riderStatus;
private Location location;
@JsonProperty("orderIds")
private Set<Long> orderIds;
@JsonProperty("createdAt")
private DateTime updatedAt;
@JsonProperty("trackedObjectId")
private String riderId;
这是我的对象映射器配置
@Bean
public ObjectMapper buildMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule()).setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerSubtypes(RiderUpdate.class, RiderStatus.class, Location.class);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
return mapper;
}
我用于序列化的mapper函数:
@Component
public class JsonUtils {
@Autowired
private ObjectMapper objectMapper;
private static final Logger logger = Logger.getLogger(JsonUtils.class);
public String serializeObject(Object object) throws IOException {
return objectMapper.writeValueAsString(object);
}
public <T> T readObject(String source, Class<T> objectClass) {
T result = null;
try {
result = objectMapper.readValue(source, objectClass);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return result;
}
我正在尝试解析以下字符串:
{\"orderIds\":[3961393],\"location\": {\"latitude\":28 , \"longitude\":77},\"createdAt\":\"2017-02-22T16:26:29.982+05:30\",\"trackedObjectId\":\"1\"}
我在解析时遇到JSON错误。:
Unexpected token (VALUE_NUMBER_INT), expected VALUE_STRING: need JSON String that contains type id (for subtype of java.util.Set)
请帮忙。谢谢。
答案 0 :(得分:0)
您需要将riderId
类型从String
更改为int
或long
private int riderId;
Number to String隐式转换是不可能的。这就是你得到错误的原因。虽然trackedObjectId
值似乎在双引号之间有一个数字,但在通过json引擎解析之后它将转换为数字。因此,实际上您的代码正在尝试为String分配一个数字。由于这是不可能的,你将获得例外。