我正在尝试使用 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"
有人可以告诉我我做错了什么(如果有的话)吗?我怎样才能获得与我正在寻找的类似的输出?
您需要禁用:
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"