生成的 YAML 文件未按所需格式设置

问题描述 投票:0回答:1

我正在尝试使用 Jackson YAML 库生成 YAML 文件。我正在寻求以特定格式创建该文件,但未能做到这一点。

我保存的数据是数据测试对象的列表。对象本身定义如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonTypeName("User")
@Builder
public class DataTest
{
   @JsonProperty("ID")
   private int userID;

   @JsonProperty("Name")
   private String userName;

   @JsonProperty("Address")
   private String streetAddress;

   @JsonProperty("City")
   private String theCity;

}

请注意,该类与 Jackson 注释一起使用 Lombok 来提供代码简洁性。

用于包含 DataTest 对象列表的对象如下:

@JsonRootName(value = "ListOfUsers")
public class DataList extends ArrayList<DataTest>
{
   private static final long serialVersionUID = 7112953850878936075L;

   public DataList()
   {
   }

   // Other constructors

}

有一些示例数据将被放入 DataTest 对象中:

public class SomeData
{
   public static String[] theNames = {
         "Jimmy Dean",
         "John Sheridan",
         "John Chriton",
         "James Kirk",
         "River Tan"
   };

   public static String[] theAddresses = {
         "12 Riverview Drive",
         "233X Blue Sector",
         "2nd Room",
         "Captain's Quarters",
         "3rd Berth"
   };

   public static String[] theCities = {
         "Greenview",
         "Babylon 5",
         "Moya the Ship",
         "USS Enterprise",
         "Serenity"
   };
}

下面的 ServiceIO 类是一个单例,它利用 Jackson API 创建 YAML 文件:

public class ServiceIO
{
   private static ServiceIO mySelf = null;

   private final ObjectMapper theMapper;
   private final File theFile;

   private ServiceIO()
   {
      theFile = new File("./files/users.yml");
      theMapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER))
                                                    .enable(SerializationFeature.WRAP_ROOT_VALUE)
                                                    .enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
   }

   public void saveServices(DataList theInfo)
   {
      try
      {
         theMapper.writeValue(theFile,theInfo);
      }
      catch(Exception exe)
      {
         exe.printStackTrace();
      }
  
   }

   public static ServiceIO getInstance()
   {
      if(mySelf == null)
         mySelf = new ServiceIO();
  
      return(mySelf);
   }

}

实际生成 YAML 文件的类很简单。它构建一组 DataTest 对象并将它们放入 DataList 中。然后它将 DataList 写入 YAML 文件。

public class YamlTest
{
   public static void main(String[] args)
   {
      DataList list = new DataList();
  
     for(int inc = 0; inc < 5; inc++)
     {
        DataTest test = DataTest.builder().userID(inc+1).userName(SomeData.theNames[inc])
                                .streetAddress(SomeData.theAddresses[inc]).theCity(SomeData.theCities[inc])
                                .build();
        list.add(test);
     }
 
     ServiceIO service = ServiceIO.getInstance();
     service.saveServices(list);
   }

}

当我运行测试应用程序时,我想生成一个内容类似于以下内容的 YAML 文件:

ListOfUsers:
  - User:
      ID: 1
      Name: "Jimmy Dean"
      Address: "12 Riverview Drive"
      City: "Greenview"
  - User:
      ID: 2
      Name: "John Sheridan"
      Address: "233X Blue Sector"
      City: "Babylon 5"
  - User:
      ID: 3
      Name: "John Chriton"
      Address: "2nd Room"
      City: "Moya the Ship"
  - User:
      ID: 4
      Name: "James Kirk"
      Address: "Captain's Quarters"
      City: "USS Enterprise"
  - User:
      ID: 5
      Name: "River Tan"
      Address: "3rd Berth"
     City: "Serenity"

DataTest 不必精确,但最后我想用“User”行分隔每个 DataTest。

相反,我得到以下输出:

ListOfUsers:
- ID: 1
  Name: "Jimmy Dean"
  Address: "12 Riverview Drive"
  City: "Greenview"
- ID: 2
  Name: "John Sheridan"
  Address: "233X Blue Sector"
  City: "Babylon 5"
- ID: 3
  Name: "John Chriton"
  Address: "2nd Room"
  City: "Moya the Ship"
- ID: 4
  Name: "James Kirk"
  Address: "Captain's Quarters"
  City: "USS Enterprise"
- ID: 5
  Name: "River Tan"
  Address: "3rd Berth"
  City: "Serenity"

有人可以告诉我我做错了什么(如果有的话)吗?我怎样才能获得与我正在寻找的类似的输出?

java jackson yaml
1个回答
0
投票

您需要禁用:

YAMLGenerator.Feature.USE_NATIVE_TYPE_ID

在DataTest上你需要添加以下注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)

进行这些更改后,yaml 将如下所示:

ListOfUsers:
- User:
    ID: 1
    Name: "Jimmy Dean"
    Address: "12 Riverview Drive"
    City: "Greenview"
- User:
    ID: 2
    Name: "John Sheridan"
    Address: "233X Blue Sector"
    City: "Babylon 5"
- User:
    ID: 3
    Name: "John Chriton"
    Address: "2nd Room"
    City: "Moya the Ship"
- User:
    ID: 4
    Name: "James Kirk"
    Address: "Captain's Quarters"
    City: "USS Enterprise"
- User:
    ID: 5
    Name: "River Tan"
    Address: "3rd Berth"
    City: "Serenity"
© www.soinside.com 2019 - 2024. All rights reserved.