Longタイプがjsonに移行するとフロントエンドjsが精度を失うソリューション
3535 ワード
一、問題の背景
Javaバックエンド開発中、特にidフィールドは、数値が大きすぎるため、json形式でフロントエンドに転送されると、js解析時に精度が失われます.
精度の喪失について何の概念もない場合は、知っている投稿を見て、次のように感じることができます.https://www.zhihu.com/question/34564427?sort=created
二、解決構想
idフィールドをjsonにシーケンス化すると、文字列タイプに変換され、フロントエンドがバックエンドに転送され、逆シーケンス化されると、再びLongに変換されます.
三、具体的な実現
dtoが存在するプロジェクトで、helperパッケージを新規作成します(名前はカスタマイズされ、既存のパッケージに入れることもできます).PS:なぜdtoプロジェクトに建設されたのですか.なぜなら、このパッケージは最後に他のグループに使用される可能性があります.これにより、すべての処理ルールロジックが統一され、ドッキングが容易になります.
クラスLongJsonSerializerをパッケージに追加します.コードは次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12 13
次に、パッケージにクラスLongJsonDeserializerを追加します.コードは次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
はい、次はこの2つのクラスを使用します.
処理が必要なidフィールドにコメントを付けます.たとえば、次のコードがあります.
1 2 3 4 5 6
投稿のソース:https://www.cnblogs.com/lvgg/p/7475140.html
Javaバックエンド開発中、特にidフィールドは、数値が大きすぎるため、json形式でフロントエンドに転送されると、js解析時に精度が失われます.
精度の喪失について何の概念もない場合は、知っている投稿を見て、次のように感じることができます.https://www.zhihu.com/question/34564427?sort=created
二、解決構想
idフィールドをjsonにシーケンス化すると、文字列タイプに変換され、フロントエンドがバックエンドに転送され、逆シーケンス化されると、再びLongに変換されます.
三、具体的な実現
dtoが存在するプロジェクトで、helperパッケージを新規作成します(名前はカスタマイズされ、既存のパッケージに入れることもできます).PS:なぜdtoプロジェクトに建設されたのですか.なぜなら、このパッケージは最後に他のグループに使用される可能性があります.これにより、すべての処理ルールロジックが統一され、ドッキングが容易になります.
クラスLongJsonSerializerをパッケージに追加します.コードは次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12 13
/**
* Long , js
*
*/
public
class
LongJsonSerializer extends JsonSerializer {
@Override
public
void
serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
String text = (value ==
null
?
null
: String.valueOf(value));
if
(text !=
null
) {
jsonGenerator.writeString(text);
}
}
}
次に、パッケージにクラスLongJsonDeserializerを追加します.コードは次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/**
* Long
*
*/
public
class
LongJsonDeserializer extends JsonDeserializer {
private
static
final Logger logger = LoggerFactory.getLogger(LongJsonDeserializer.
class
);
@Override
public
Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String value = jsonParser.getText();
try
{
return
value ==
null
?
null
: Long.parseLong(value);
}
catch
(NumberFormatException e) {
logger.error(
" "
, e);
return
null
;
}
}
}
はい、次はこの2つのクラスを使用します.
処理が必要なidフィールドにコメントを付けます.たとえば、次のコードがあります.
1 2 3 4 5 6
/**
* id
*/
@JsonSerialize(
using
= LongJsonSerializer.
class
)
@JsonDeserialize(
using
= LongJsonDeserializer.
class
)
private
Long id;
投稿のソース:https://www.cnblogs.com/lvgg/p/7475140.html