在JSON中反序列化Set时出错

时间:2017-02-28 13:05:52

标签: java json serialization spring-boot

我有一个用例,我必须对对象使用多态,因为这些是来自第三方服务器的响应。 这是我的回复课程之一:

@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)

请帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将riderId类型从String更改为intlong

private int riderId;

Number to String隐式转换是不可能的。这就是你得到错误的原因。虽然trackedObjectId值似乎在双引号之间有一个数字,但在通过json引擎解析之后它将转换为数字。因此,实际上您的代码正在尝试为String分配一个数字。由于这是不可能的,你将获得例外。