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 /**   * 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