これは、そこにいるすべての 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?
}
質問は:
- json 出力がモデル インターフェイスのゲッター名を反映するように ItemModel をシリアル化するにはどうすればよいですか?
- 具体的には、これを最も簡単に行うライブラリはどれですか? 特定のライブラリを使用してこれをどのように達成しますか?
- 最後に、ItemModel 内にラップされた Item オブジェクトをシリアル化したくありません
出力を次のようにしたい:
{item : {name: '', dateCreated : '', timeCreated : '', lastUpdated : '', lastUpdatedTime : ''}
前もって感謝します!
これまでにやってきたことを共有し、フィードバックを得るべきだと思いました。私の要件をほぼ満たしていますが、正しい方法かどうかはわかりません。
ここのユーザーから genson を指摘されましたが、非常に興味深いと思います。
まず、シリアライザーを作成しました
public class ModelSerializer は Serializer を実装します {
@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)); のインスタンスです。