0

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 にヒットします。これは必要なものではありません。

何かアドバイス?

4

1 に答える 1