java 解析 yaml


当前还在维护的YAML解析器/生成器有:
  • SnakeYAML
    • 完整的YAML 1.1解析器,尤其是SnakeYAML能够分析来自于规范的所有示例
    • 支持Unicode,包括UTF-8/UTF-16的输入/输出
    • 为序列化和反序列化本地的Java对象提供了高级API
    • 支持YAML类型库中的所有类型
    • 比较理性的错误信息
  • YamlBeans:支持YAML 1.0和1.1
  • FasterXML/jackson-dataformat-yaml:处于原型阶段

SnakeYAML和YamlBeans都在Google Code仓库时,SnakeYAML的使用人数和提交者均优于YamlBeans。目前大多数帖子还是推荐选用SnakeYAML,而SpringBoot读取YAML配置采用的就是SnakeYAML。

为了测试SnakeYAML,我首先创建了一个HelloSnakeYAML项目。
conf.yaml
spring:
    application:
        name: cruncher
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
server:
    port: 9000

Contact.java
package com.yqu.yaml;

import java.util.List;

public class Contact {
    private String name;
    private int age;
    private List phoneNumbers;

    public Contact(String name, int age, List phoneNumbers) {
        this.name name;
        this.age age;
        this.phoneNumbers phoneNumbers;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age age;
    }

    public List getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List phoneNumbers) {
        this.phoneNumbers phoneNumbers;
    }
}

Phone.java
package com.yqu.yaml;

public class Phone {
    private String name;
    private String number;

    public Phone(String name, String number) {
        this.name name;
        this.number number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number number;
    }
}

HelloSnakeYAML.java
package com.yqu.yaml;


import org.yaml.snakeyaml.Yaml;

import java.io.FileInputStream;
import java.io.FileWriter;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class HelloSnakeYAML {
    public static void test1() {
        try {
            Yaml yaml new Yaml();
            URL url HelloSnakeYAML.class.getClassLoader().getResource("conf.yaml");
            if (url != null) {
                Object obj yaml.load(new FileInputStream(url.getFile()));
                System.out.println(obj);
            }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void test2() {
        try {
            Contact c1 new Contact("test1", 1, Arrays.asList(
                    new Phone("home", "1111"),
                    new Phone("work", "2222")));
            Contact c2 new Contact("test2", 23, Arrays.asList(
                    new Phone("home", "1234"),
                    new Phone("work", "4321")));
            List contacts Arrays.asList(c1, c2);
            Yaml yaml new Yaml();
            yaml.dump(contacts, new FileWriter("contact.yaml"));
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        test1();
        test2();
    }
}

build.gradle
buildscript {
    repositories {
        mavenCentral()
        maven url "http://repo.spring.io/libs-milestone" }
    }

}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'

jar {
    baseName 'HelloSnakeYAML'
    version  '0.1.0'
}

repositories {
    mavenCentral()
    maven url "http://repo.spring.io/libs-milestone" }
}

sourceCompatibility 1.7
targetCompatibility 1.7

dependencies  
    compile("org.yaml:snakeyaml:1.15")    
}

task wrapper(type: Wrapper) {
    gradleVersion '2.3'
}


test1结果
{spring={application={name=cruncher}, datasource={driverClassName=com.mysql.jdbc.Driver, url=jdbc:mysql://localhost/test}}, server={port=9000}}

test2结果
!!com.yqu.yaml.Contact
  age: 1
  name: test1
  phoneNumbers:
  {name: home, number: '1111'}
  {name: work, number: '2222'}
- !!com.yqu.yaml.Contact
  age: 23
  name: test2
  phoneNumbers:
  {name: home, number: '1234'}
  {name: work, number: '4321'}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值