【发布时间】:2015-12-24 00:19:18
【问题描述】:
我目前正在学习一个教程来帮助我了解 JavaFX 的工作原理,并且在教程中他们正在构建一个小型应用程序来管理人们的信息。本教程还使用 XML 进行加载/保存,但我不想使用 XML,而是想使用 JSON。我有一个使用StringProperty、IntegerProperty 和ObjectProperty 的Person 模型。我的问题是,我不确定加载和保存它的最佳方法是什么,而不保存不必要的字段,并且加载时 Gson 不会引发错误。
人
import java.time.LocalDate;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
/**
* Model class for a Person.
*
* @author Marco Jakob
*/
public class Person {
private final StringProperty firstName;
private final StringProperty lastName;
private final StringProperty street;
private final IntegerProperty postalCode;
private final StringProperty city;
private final ObjectProperty<LocalDate> birthday;
/**
* Default constructor.
*/
public Person() {
this(null, null);
}
/**
* Constructor with some initial data.
*
* @param firstName
* @param lastName
*/
public Person(String firstName, String lastName) {
this.firstName = new SimpleStringProperty(firstName);
this.lastName = new SimpleStringProperty(lastName);
// Some initial dummy data, just for convenient testing.
this.street = new SimpleStringProperty("some street");
this.postalCode = new SimpleIntegerProperty(1234);
this.city = new SimpleStringProperty("some city");
this.birthday = new SimpleObjectProperty<LocalDate>(LocalDate.of(1999, 2, 21));
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String firstName) {
this.firstName.set(firstName);
}
public StringProperty firstNameProperty() {
return firstName;
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String lastName) {
this.lastName.set(lastName);
}
public StringProperty lastNameProperty() {
return lastName;
}
public String getStreet() {
return street.get();
}
public void setStreet(String street) {
this.street.set(street);
}
public StringProperty streetProperty() {
return street;
}
public int getPostalCode() {
return postalCode.get();
}
public void setPostalCode(int postalCode) {
this.postalCode.set(postalCode);
}
public IntegerProperty postalCodeProperty() {
return postalCode;
}
public String getCity() {
return city.get();
}
public void setCity(String city) {
this.city.set(city);
}
public StringProperty cityProperty() {
return city;
}
public LocalDate getBirthday() {
return birthday.get();
}
public void setBirthday(LocalDate birthday) {
this.birthday.set(birthday);
}
public ObjectProperty<LocalDate> birthdayProperty() {
return birthday;
}
}
保存personData 是ObservableList 的Persons
try (Writer writer = new FileWriter(file)) {
new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(personData, writer);
}
这种保存方式目前会生成包含许多不必要字段的保存,例如 name、value 等,但可能是 "firstName": "Hans"
[{
"firstName": {
"name": "",
"value": "Hans",
"valid": true,
"helper": {
"observable": {}
}
},
"lastName": {
"name": "",
"value": "Muster",
"valid": true,
"helper": {
"observable": {}
}
},
"street": {
"name": "",
"value": "some street",
"valid": true
},
"postalCode": {
"name": "",
"value": 1234,
"valid": true
},
"city": {
"name": "",
"value": "some city",
"valid": true
},
"birthday": {}
}]
现在,即使尝试使用 Gson 加载上面的字符串,它也会产生错误,Failed to invoke public javafx.beans.property.StringProperty() with no args。
加载器
Person[] persons;
try (Reader reader = new FileReader(file)) {
persons = gson.fromJson(reader, Person[].class);
}
personData.clear();
personData.addAll(persons);
我在 Google 上搜索过是否可以在 Gson 中使用 getter 和 setter,但似乎不太可能,所以我不知道该怎么做。
【问题讨论】: