Genson を使用して、Long id を持つオブジェクトを JSON にシリアル化しようとしています。
JSON にシリアル化し、Java に戻すとうまく機能します。しかし、私は JavaScript でデシリアライズしています。
JavaScript は完全な 64 ビットのunsigned intを Number としてサポートできないため (JavaScript で ID の最後の数ビットがゼロになっていることがわかりました)、シリアル化中に Long ID を String に変換する必要があります。
Object 内のすべての Long を変換したくないので、id フィールドだけに Converter を使用しようとしています。
import com.owlike.genson.annotation.JsonConverter;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;
...
/** the local database ID for this order */
@JsonConverter(LongToStringConverter.class)
@Id
@Setter
@Getter
private Long id;
/** The unique ID provided by the client */
@Setter
@Getter
private Long clientKey;
私のコンバーターコードは次のようになります。
public class LongToStringConverter implements Converter<Long> {
/** Default no-arg constructor required by Genson */
public LongToStringConverter() {
}
@Override
public Long deserialize(ObjectReader reader, Context ctx) {
return reader.valueAsLong();
}
@Override
public void serialize(Long obj, ObjectWriter writer, Context ctx) {
if (obj != null) {
writer.writeString(obj.toString());
}
}
}
シリアライゼーション自体を呼び出すとき、私は特別なことは何もしていません:
Genson genson = new GensonBuilder().useIndentation(true).create();
String json = genson.serialize( order );
これはうまくいきません。出力は次のようになります。
{
"clientKey":9923001278,
"id":1040012110000000002
}
私が達成しようとしているのはこれです:
{
"clientKey":9923001278,
"id":"1040012110000000002" // value is quoted
}
また、 Converter を GensonBuilder に渡そうとしましたが、それはオブジェクト内のすべての Long にヒットします。これは必要なものではありません。
何かアドバイス?