添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文介绍Jackson 2.X中提供的xml序列化功能。仅介绍基本操作,不涉及复杂和自定义功能。

1. XmlMapper对象

XmlMapper是Jackson 2.x中提供我们实现xml序列化的主要类,因此首先需要创建其实例:

XmlMapper mapper = new XmlMapper();

想要maven依赖脚本为:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.8</version>
</dependency>

2. 序列化至xml

XmlMapper是json序列化ObjectMapper类的子类,对父类增加了一些关于xml规范的调整。下面关于如何使用其实现序列化,首先让我们定义一个示例类:

class SimpleBean {
    private int x = 1;
    private int y = 2;
    //standard setters and getters

2.1. 序列化为xml字符串

我们首先序列化java对象为xml字符串:

@Test
public void whenJavaSerializedToXmlStr_thenCorrect() throws JsonProcessingException {
    XmlMapper xmlMapper = new XmlMapper();
    String xml = xmlMapper.writeValueAsString(new SimpleBean());
    assertNotNull(xml);

生成结果为:

<SimpleBean>
    <x>1</x>
    <y>2</y>
</SimpleBean>

2.2. 序列化为xml文件

下面序列化为xml文件:

@Test
public void whenJavaSerializedToXmlFile_thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.writeValue(new File("simple_bean.xml"), new SimpleBean());
    File file = new File("simple_bean.xml");
    assertNotNull(file);

同样生成simple_bean.xml文件的内容如下:

<SimpleBean>
    <x>1</x>
    <y>2</y>
</SimpleBean>

3. 反序列化xml至Java

本节说明如何从xml中获取java对象。

3.1. 从xml字符串反序列化

和序列化一样,我们可以从xml字符串反序列化获得java对象:

@Test
public void whenJavaGotFromXmlStr_thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    SimpleBean value
      = xmlMapper.readValue("<SimpleBean><x>1</x><y>2</y></SimpleBean>", SimpleBean.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);

3.2. 从xml文件反序列化

同理,xml文件也能转换为Java对象。首先读文件至输入流,然后使用简单方法转换输入流至字符串,剩下工作和上节一样:

@Test
public void whenJavaGotFromXmlFile_thenCorrect() throws IOException {
    File file = new File("simple_bean.xml");
    XmlMapper xmlMapper = new XmlMapper();
    String xml = inputStreamToString(new FileInputStream(file));
    SimpleBean value = xmlMapper.readValue(xml, SimpleBean.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);

inputStreamToString方法代码如下:

public String inputStreamToString(InputStream is) throws IOException {
    StringBuilder sb = new StringBuilder();
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    while ((line = br.readLine()) != null) {
        sb.append(line);
    br.close();
    return sb.toString();

4. 处理大写元素

本节描述下序列化或反序列化过程中如何处理大写元素。

4.1. 从xml字符串反序列化

假定有下面xml字符串,其中一个字段值为大写:

<SimpleBeanForCapitalizedFields>
    <X>1</X>
    <y>2</y>
</SimpleBeanForCapitalizedFields>

为了正确处理大写元素,需要在x字段上增加@JsonProperty("X")注解:

class SimpleBeanForCapitalizedFields {
    @JsonProperty("X")
    private int x = 1;
    private int y = 2;
    // standard getters, setters

这时则可以正确反序列化xml字符串为java对象:

@Test
public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    SimpleBeanForCapitalizedFields value
      = xmlMapper.readValue(
      "<SimpleBeanForCapitalizedFields><X>1</X><y>2</y></SimpleBeanForCapitalizedFields>",
      SimpleBeanForCapitalizedFields.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);

4.2. 序列化为xml字符串

通过增加注解@JsonProperty,可以正确序列化java对象至包括大写元素的xml字符串:

@Test
public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect()
  throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"),
      new SimpleBeanForCapitalizedFields());
    File file = new File("target/simple_bean_capitalized.xml");
    assertNotNull(file);

5. 列表属性

5.1. 序列化列表属性

XmlMapper 能够序列化整个java bean至xml文档。下面说明如何序列化嵌套对象和数组。

我们需求是序列号Person对象,嵌套了Address对象至xml,最终xml如下:

<Person>
    <firstName>Rohan</firstName>
    <lastName>Daye</lastName>
    <phoneNumbers>
        <phoneNumbers>9911034731</phoneNumbers>
        <phoneNumbers>9911033478</phoneNumbers>
    </phoneNumbers>
    <address>
        <streetName>Name1</streetName>
        <city>City1</city>
    </address>
    <address>
        <streetName>Name2</streetName>
        <city>City2</city>
    </address>
</Person>

我们看电话号码被phoneNumbers元素包装,而地址没有。我们可以通过@JacksonXMLElementWrapper 注解表达这种差异:

public final class Person {
    private String firstName;
    private String lastName;
    private List<String> phoneNumbers = new ArrayList<>();
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Address> address = new ArrayList<>();
    //standard setters and getters

实际上,也能改变包装元素的名称,如:@JacksonXmlElementWrapper(localName = ‘phoneNumbers’)。或者如果不需要包装元素,也可以使用注解禁用:@JacksonXmlElementWrapper(useWrapping = false)
下面定义Address类:

public class Address {
    String streetName;
    String city;
    //standard setters and getters

Jackson负责下面的工作,和前面一样仅需要简单调用writeValue方法:

private static final String XML = "<Person>...</Person>";
@Test
public void whenJavaSerializedToXmlFile_thenSuccess() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    Person person = testPerson(); // test data
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    xmlMapper.writeValue(byteArrayOutputStream, person); 
    assertEquals(XML, byteArrayOutputStream.toString()); 

5.2. 反序列化列表属性

Jackson也可以读包括list对象的xml文档。假如读取前面的xml,使用readValue方法:

@Test
public void whenJavaDeserializedFromXmlFile_thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    Person value = xmlMapper.readValue(XML, Person.class);
    assertEquals("City1", value.getAddress().get(0).getCity());
    assertEquals("City2", value.getAddress().get(1).getCity());

6. 总结

本文简单描述如何序列化和反序列化xml。也提及如何解决大写元素和负责的嵌套对象问题。

Jackson实现xml序列化和反序列化本文介绍Jackson 2.X中提供的xml序列化功能。仅介绍基本操作,不涉及复杂和自定义功能。1. XmlMapper对象XmlMapper是Jackson 2.x中提供我们实现xml序列化的主要类,因此首先需要创建其实例:XmlMapper mapper = new XmlMapper();想要maven依赖脚本为:&lt;dependen... 如果直接使用类似JsonHelper.fromJson()方法反序列化json串到Java的List对象集合时,容易将List集合内的对象反序列化为LinkedHashMap(),此时使用对象的get方法获取属性的值时抛异常,因此使用fasterxml.jackson的以下方法完美解决: ObjectMapper mapper = new ObjectMapper(); //设置反序列化时有多于Java属性信息不报异常(忽略多于字段) mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 该项目包含用于读取和写入编码数据的扩展组件。 此外,目标是模拟数据绑定如何与“代码优先”方法一起工作(即,不添加对“架构优先”方法的支持)。 提供了对JAXB批注的支持; 此模块提供了低级抽象( JsonParser , JsonGenerator和JsonFactory ),以及使数据绑定工作所需的少量高级重写。 但是,值得注意的是,目标并非是完整的JAXB克隆;而是一个完整的JAXB克隆。 或作为通用XML工具箱。 具体来说: 尽管XML序列化在理想情况下应该类似于JAXB输出,但偏差不一定被视为错误-我们会尽力而为 应该保证的是,使用此模块编写的任何XML也必须使用该模块可读:也就是说,我们的目标是进行完整的XML序列化。 从上面开始:有些XML构造模块将无法处理; 包括JAXB支持的某些情况 但是,此模块可能还支持JAXB无法处理的构造和用例:特别地,支持Jacks <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.11.2</version> </dependency> 2、标签说明 @JacksonXmlRo
Jackson-操作XML Jackson是一个处理JSON的类库,不过它也通过jackson-dataformat-xml包提供了处理XML的功能。Jackson建议我们在处理XML的时候使用woodstox-core包,它是一个XML实现,比JDK自带XML实现更加高效,也更加安全。 Jackson常用注解 1、@JacksonXmlRootElement @JacksonXmlRootElement注解有两个属性: namespace属性:用于指定XML根元素命名空间的名称。 localna
Jackson 生成xml格式文件 Jackson是java应用中流行的操作Json工具库,很快成为Java生态中事实标准,Spring boot默认也使用Jackson。从版本2开始,支持json的同时引入成熟的xml实现。 1. 环境依赖 增加Jackson xml 模块,仅需要一个依赖: <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId&gt
前期写了一篇关于 DOM4j 解析 XML 的,但是得知 Jackson 也支持解析 XML,所以打算也写一篇关于 Jackson 解析 XML 的,俗称 xml序列化反序列化 这边我使用 maven 构建工程 找到 pom.xml 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://...
昨天写了使用 Jackson 玩转 xml序列化反序列化,主要使用的是 XmlMapper 对象去操作,今天打算尝试下使用流式 API 的方式去操作。公司墙很高,人总是在逆境中成长的对吧,墙高使得我不断输出,以便在公司里有可用的资料完成我的工作和任务,达到早日走向人生颠覆的境界。 关于 使用 Jackson 玩转 xml序列化反序列化 参考我昨天写的博文https://blog.csdn.net/growl_jie_/article/details/105604358 网上找了个介绍,流式API读取和写入JSON内容离散事件。 JsonParser读取数据,而JsonGenerat
用于PostGIS Geometry对象的GeoJSON Jackson序列化器和反序列化器。 GeoJSON支持 该库支持对GeoJSON规范中定义的所有序列化/反序列化。 下面给出了GeoJSON几何对象与PostGIS对象之间的关系: GeoJSON 邮政地理信息系统 将JitPack存储库添加到pom.xml文件的<repositories>列表中: < repository> < id>jitpack.io</ id> < url>https://jitpack.io</ url> </ repository> 然后将依赖项添加到您的pom.xml文件中: < dependency> < groupId>com.github.mayconbordin</ groupId
Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。 前面有介绍过json-lib这个框架,在线博文:http://www.open-open.com/lib/view/open1327991992093.html 相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区
使用Jackson实现对象,json,xml,map的转换前言一、pom文件二、创建实体类三、对象、json、xml、map的转换四、运行结果 使用Jackson实现对象,json,xml,map的互相转换
Jackson是一个非常流行的Java库,用于将Java对象序列化为JSON格式,或将JSON格式的数据反序列化为Java对象。下面是使用Jackson进行JSON序列化和解析的示例代码: 1. 导入Jackson库的依赖: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> 2. 创建一个Java对象: ```java public class Person { private String name; private int age; private List<String> hobbies; // 省略getter和setter方法 3. 将Java对象序列化为JSON格式: ```java ObjectMapper objectMapper = new ObjectMapper(); Person person = new Person(); person.setName("张三"); person.setAge(20); person.setHobbies(Arrays.asList("篮球", "游泳")); String json = objectMapper.writeValueAsString(person); System.out.println(json); 输出结果: ```json {"name":"张三","age":20,"hobbies":["篮球","游泳"]} 4. 将JSON格式的数据反序列化为Java对象: ```java String json = "{\"name\":\"张三\",\"age\":20,\"hobbies\":[\"篮球\",\"游泳\"]}"; Person person = objectMapper.readValue(json, Person.class); System.out.println(person.getName()); System.out.println(person.getAge()); System.out.println(person.getHobbies()); 输出结果: [篮球, 游泳] 以上就是使用Jackson进行JSON序列化和解析的方法。