这适用于所有JSON大脑。如何自定义JSON输出以获得更精细的细节
比方说,我有这样的接口:
public interface Model {
String getName();
String getDateCreated();
String getTimeCreated();
String getLastUpdated();
String getLastUpdatedTime();
}
然后让我们说我有一个产品对象:
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 : {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并通过串行
Genson genson =新Genson。 Builder()。withSerializer(new ModelSerializer(),Model.class).create();
现在,当我通过视图模型,我得到的领域格式如我所料
模型视图模型=新ItemModel(的DomainModel);其中domainModel是项目的一个实例 System.out.println(genson.serialize(viewModel));
非常喜欢Genson!但你为什么要做所有的反思?你期望的确切输出是什么?您应该将您的序列化器定义为ModelSerializer实现序列化器 {... class code ...},然后使用Builder()。withConverters(new ModelSerializer())create()注册它。 –
eugen
为什么你不做新的Genson()。serialize(viewModel); ?你会得到与你的自定义序列化程序相同的输出(我测试了两种解决方案)。 – eugen
您是否注意到Model接口仅返回字符串值,而Item返回字符串和日期?您必须为日期输出做一些格式设置,并且这导致了问题。 – mainas