使用Jackson实现xml、json自动转子类

当使用xml进行网络传输时,一般会有请求头和请求体,不同的请求会有不同的请求体,当转换为实体类时,若包含父子关系,我们一般都会使用一下方式转换。

@JacksonXmlRootElement
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class A<T extends B> {

    @JacksonXmlProperty(localName = "B")
    private T b;
}
@JacksonXmlRootElement
@JsonInclude(JsonInclude.Include.NON_NULL)
public class B {
}
@Data
public class C extends B {

    @JacksonXmlProperty(localName = "Test1")
    private String test1;
    @JacksonXmlProperty(localName = "Test2")
    private String test2;
}

@Data
public class D extends B {
    @JacksonXmlProperty(localName = "Test3")
    private String test3;
    @JacksonXmlProperty(localName = "Test4")
    private String test4;
}

public static void main(String[] args) throws JsonProcessingException {
    XmlMapper mapper = new XmlMapper();
    A a = new A();
    C c = new C();
    c.setTest1("daffad");
    c.setTest2("eqrewrqrew");
    a.setB(c);
    String xml = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(a);
    System.out.println(xml);
    JavaType javaType = mapper.getTypeFactory().constructParametricType(A.class,C.class);
    A a1 = mapper.readValue(xml, javaType);
    C b1 = (C) a1.getB();
    System.out.println(b1.getTest1());
}

       以上方式必须指定需要转换的子类,但有时我们需要根据某些字段动态转换成不同的子类,比如对请求进行编解码后是xml字符串,然后需要将xml字符串转换成实体类,这时就需要我们自定义解析器来实现,并使用@JsonDeserialize注解,如下

@JacksonXmlRootElement
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
@JsonDeserialize(using = ADeserializer.class)
public class A {
    
    @JacksonXmlProperty(localName = "Header")
    private Header header;
    @JacksonXmlProperty(localName = "B")
    private B b;
}

@JacksonXmlRootElement
@JsonInclude(JsonInclude.Include.NON_NULL)
public class B {
}
@Data
public class C extends B {

    @JacksonXmlProperty(localName = "Test1")
    private String test1;
    @JacksonXmlProperty(localName = "Test2")
    private String test2;
}

@Data
public class D extends B {
    @JacksonXmlProperty(localName = "Test3")
    private String test3;
    @JacksonXmlProperty(localName = "Test4")
    private String test4;
}

@JacksonXmlRootElement
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Header {
    @JacksonXmlProperty(localName = "Type")
    private String type;
}

public class ADeserializer extends JsonDeserializer<A> {
    @Override
    public A deserialize(JsonParser parser, DeserializationContext ctx) throws IOException, JsonProcessingException {
        A a = new A();
        TreeNode treeNode = parser.getCodec().readTree(parser);
        TreeNode headerNode = treeNode.get("Header");
        Header header = parser.getCodec().treeToValue(headerNode, Header.class);
        TreeNode b = treeNode.get("B");
        a.setHeader(header);
        if ("1".equals(header.getType())) {
            C c = parser.getCodec().treeToValue(b, C.class);
            a.setB(c);
        }
        if ("2".equals(header.getType())) {
            D d = parser.getCodec().treeToValue(b, D.class);
            a.setB(d);
        }
        return a;
    }
}
public static void main(String[] args) throws JsonProcessingException {
        XmlMapper mapper = new XmlMapper();
        A a = new A();
        C c = new C();
        Header header = new Header();
        header.setType("1");
        a.setHeader(header);
        c.setTest1("daffad");
        c.setTest2("eqrewrqrew");
        a.setB(c);
        String xml = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(a);
        System.out.println(xml);
        A a1 = mapper.readValue(xml, A.class);
        C b1 = (C) a1.getB();
        System.out.println(b1.getTest1());
}

 以上就是通过自定义Jackson解析器实现xml转对象的例子,json转对象和以上是一样的,只不过使用的是json注解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值