首页 > 解决方案 > 使用属性值中的序列化 JSON 反序列化 JSON

问题描述

这是我收到的 JSON:

{
  "Type": "Notification",
  "Id": "dc8872fa-dda3-5d97-808f-2b54ad904167",
  "Message": "[{\"CarNo\":\"123\",\"TransactionNo\":\"1234\",\"ReceiptNo\":\"12345\",\"Date\":\"05/09/21\",\"Time\":\"124204\"},{\"CarNo\":\"3425\",\"TransactionNo\":\"12912\",\"ReceiptNo\":\"1030010619\",\"Date\":\"05/09/21\",\"Time\":\"124204\"},{\"CarNo\":\"3425\",\"TransactionNo\":\"12912\",\"ReceiptNo\":\"1030010619\",\"Date\":\"05/09/21\",\"Time\":\"124204\"}]",
}

我想将消息映射到类Event

public class Event {

    private String Type;
    private String MessageId;
    private List<Item> Message;
}

public class Item {

    private String CarNo;
    private String TransactionNo;
    private String ReceiptNo;
    private String LineNo;
    private String Date;
    private String Time;

}

由于消息属性的值是一个字符串,我很难将它映射到列表。我应该如何将收到的 JSON 映射到定义的 POJO?

标签: javajsondeserializationpojoobjectmapper

解决方案


这可以通过杰克逊使用自定义来完成JsonDeserializer

public class JsonStringListDeserializer<T> extends JsonDeserializer<List<T>> {

    @Override
    public List<T> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getValueAsString();
        if (value == null) {
            return Collections.emptyList();
        }
        return new ObjectMapper().readValue(value, new TypeReference<>() {
        });
    }
}

然后可以将反序列化器用于以下message属性Event

@JsonProperty("Message")
@JsonDeserialize(using = JsonStringListDeserializer.class)
private List<Item> message;

顺便说一句,您应该为类的成员使用小写的驼峰式名称(message而不是Message)。@JsonProperty您仍然可以通过使用注解在 JSON 中使用大写属性,如上面的代码 ( @JsonProperty("Message"))。


推荐阅读