2011-03-22 83 views
3

我試圖從YAML文件讀取輸入,具有下列內容:如何閱讀yaml中的列表?

- !com.example.Contact 
    name: Nathan Sweet 
    age: 28 
    address: pak 
    phoneNumbers: 
    - !com.example.Phone 
     name: Home 
     number: 1122 
    - !com.example.Phone 
     name: Work 
     number: 3322 
- !com.example.Contact 
    name: Nathan Sw1eet 
    age: 281 
    address: pak1 
    phoneNumbers: 
    - !com.example.Phone 
     name: Home1 
     number: 11221 
    - !com.example.Phone 
     name: Work1 
     number: 33211 

我有以下定義:

import java.util.List; 
import java.util.Map; 

public class Contact 
{ 
    public String name; 
    public int age; 
    public String address; 
    public List phoneNumbers; 
} 
public class Phone 
{ 
    public String name; 
    public String number; 
} 

一些能告訴我怎麼去閱讀這些電話號碼

回答

7

我不得不重寫你的YAML有點...

- !!com.example.Contact 
    name: Nathan Sweet 
    age: 28 
    address: pak 
    phoneNumbers: 
    - !!com.example.Phone 
     name: Home 
     number: 1122 
    - !!com.example.Phone 
     name: Work 
     number: 3322 
- !!com.example.Contact 
    name: Nathan Sw1eet 
    age: 281 
    address: pak1 
    phoneNumbers: 
    - !!com.example.Phone 
     name: Home1 
     number: 11221 
    - !!com.example.Phone 
     name: Work1 
     number: 33211 

的Java ...

package com.example; 

import org.springframework.core.io.DefaultResourceLoader; 
import org.springframework.core.io.Resource; 
import org.yaml.snakeyaml.Yaml; 
import org.yaml.snakeyaml.constructor.Constructor; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Collection; 

public class LoadContacts { 
    private static String yamlLocation="classpath:contacts.yaml"; 

    public static void main(String[] args) throws IOException{ 
     Yaml yaml = new Yaml(new Constructor(Collection.class)); 
     InputStream in = null; 
     Collection<Contact> contacts; 
     try { 
      in = new FileInputStream(new File(yamlLocation)); 
      contacts = (Collection<Contact>) yaml.load(in); 
     } catch (IOException e) { 
       final DefaultResourceLoader loader = new DefaultResourceLoader(); 
       final Resource resource = loader.getResource(yamlLocation); 
       in = resource.getInputStream(); 
       contacts = (Collection<Contact>) yaml.load(in); 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (Exception e) { 
        // no-op 
       } 
      } 
     } 
     for(Contact contact:contacts){ 
      System.out.println(contact.name + ":" + contact.address + ":" + contact.age); 
     } 
    } 
} 
1

因爲我碰到這個帖子來讀取用戶對象的列表,這裏是我使用的是什麼Jackson

import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; 

import java.io.File; 
import java.io.IOException; 
import java.util.List; 

public class LoadContacts { 

    private static String yamlLocation = "path_to/../contacts.yml"; 

    public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 

    try { 
     List<Contact> contactList = mapper.readValue(new File(yamlLocation), new TypeReference<List<Contact>>(){}); 
     contactList.forEach(System.out::println); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

mapper.readValue(..)發生在多個參數如第一個參數的URL,String。該解決方案使用File。 我爲OP問題正確工作所做的一個更改是定義phoneNumbers,如下所示:

public List<Phone> phoneNumbers;