这适用于所有 JSON 大脑。
假设我有一个类似的界面:
public interface Model {
String getName();
String getDateCreated();
String getTimeCreated();
String getLastUpdated();
String getLastUpdatedTime();
}
然后假设我有一个 Item 对象:
public class Item {
private String name;
private Date created;
private Date updated;
..setters and getters
}
然后假设我有一个模型包装器:
public class ItemModel implements Model {
private final Item item;
public ItemModel(Item item){
this.item = item;
}
public String getName(){
return item.getName();
}
public String getDateCreated(){
Date created = item.getCreated();
//format the date nicely and return a date string
}
public String getTimeCreated(){
Date created = item.getCreated();
//format the date nicely and return a time string
}
...you get the gyst, right?
}
问题是:
- 如何序列化 ItemModel 以便 json 输出将反映模型接口上的 getter 名称?
- 具体来说,哪个库最容易做到这一点?您如何使用特定的库来实现这一点?
- 最后,我不想序列化包装在 ItemModel 中的 Item 对象
我希望输出是这样的:
{item : {name: '', dateCreated : '', timeCreated : '', lastUpdated : '', lastUpdatedTime : ''}
提前致谢!
我想我应该分享到目前为止我所能做的,并得到你的反馈。它几乎可以满足我的要求,但我不确定这是否正确:
这里的一位用户向我指出了 genson,我觉得它很有趣。
首先我创建了一个序列化器
公共类 ModelSerializer 实现序列化器 {
@Override
public void serialize(T target, ObjectWriter writer, Context cntxt) throws TransformationException, IOException {
writer.beginObject();
for (Method method : target.getClass().getMethods()) {
String methodName = method.getName();
if (methodName.startsWith("get")) {
int index = "get".length();
String valueName = Character.toLowerCase(methodName.charAt(index)) + method.getName().substring(index + 1);
try {
String valueString = (String) method.invoke(target, new Object[]{});
writer.writeName(valueName).writeValue(valueString);
} catch (IllegalArgumentException ex) {
Logger.getLogger(ModelSerializer.class.getName()).log(Level.SEVERE, null, ex);
throw new TransformationException(ex.getMessage());
} catch (IllegalAccessException ex) {
Logger.getLogger(ModelSerializer.class.getName()).log(Level.SEVERE, null, ex);
throw new TransformationException(ex.getMessage());
} catch (InvocationTargetException ex) {
Logger.getLogger(ModelSerializer.class.getName()).log(Level.SEVERE, null, ex);
throw new TransformationException(ex.getMessage());
}
}
}
writer.endObject();
}
}
接下来,我创建了 Genson 并通过了 Serializer
Genson genson = new Genson.Builder().withSerializer(new ModelSerializer(), Model.class).create();
现在,当我通过 ViewModel 时,我得到了按预期格式化的字段
模型 viewModel = new ItemModel(domainModel); 其中 domainModel 是 Item System.out.println(genson.serialize(viewModel)) 的一个实例;