【问题标题】:How to apply the @Key of the Message class in the Firebase Admin SDK when serializing using Gson使用 Gson 进行序列化时如何在 Firebase Admin SDK 中应用 Message 类的 @Key
【发布时间】:2021-09-07 06:31:21
【问题描述】:

在用Gson序列化消息类的builder创建的对象时,想得到键名android。

我认为@Key 应该得到 android,而不是 androidConfig,作为序列化的结果,但事实并非如此。 Objectmapper 和 Gson 也是如此。

我的开发环境是 Spring Boot 2.3.12.RELEASE、Firebase ADMIN SDK 8.0.1.、Gson 2.8.8

[source]
message = Message.builder()
                    .setNotification(Notification.builder()
                            .setTitle(pushMessageDto.getTitle())
                            .setBody(pushMessageDto.getBody())
                            .setImage(pushMessageDto.getImage())
                            .build())
                    .setAndroidConfig(AndroidConfig.builder()
                            .setTtl(3600 * 1000)
                            .setNotification(AndroidNotification.builder()
                                    .setIcon(ar.getIcon())
                                    .setColor(ar.getColor())
                                    .setClickAction(ar.getClickAction())
                                    .build())
                            .build())
                    .setTopic(pushMessageDto.getTopic())
                    .build();
Gson gson = new Gson();
String m = gson.toJson(message);
[serializing results]
{
   "validate_only":false,
   "message":{
      "notification":{
         "title":"a",
         "body":"b",
         "image":"c"
      },
      "androidConfig":{
         "ttl":"3",
         "notification":{
            "icon":"",
            "color":"#32a852",
            "clickAction":"MainActivity",
         }
      },
      "topic":"weather"
   }
}
[Message class of Firebase Admin SDK]
public class Message {

  @Key("data")
  private final Map<String, String> data;

  @Key("notification")
  private final Notification notification;

  @Key("android")
  private final AndroidConfig androidConfig;

  @Key("webpush")
  private final WebpushConfig webpushConfig;

  @Key("apns")
  private final ApnsConfig apnsConfig;

  @Key("token")
  private final String token;

  @Key("topic")
  private final String topic;

  @Key("condition")
  private final String condition;

  @Key("fcm_options")
  private final FcmOptions fcmOptions;

【问题讨论】:

    标签: java firebase firebase-cloud-messaging gson message


    【解决方案1】:

    Gson 默认只支持 @SerializedName 注解来指定自定义 JSON 成员名称。

    假设您使用的@Key 注解在运行时可用(@Retention(RUNTIME)),您可以编写自定义FieldNamingStrategy

    public class KeyFieldNamingStrategy implements FieldNamingStrategy {
        private final FieldNamingStrategy delegate;
        
        public KeyFieldNamingStrategy(FieldNamingStrategy delegate) {
            this.delegate = delegate;
        }
    
        @Override
        public String translateName(Field f) {
            Key key = f.getAnnotation(Key.class);
            if (key == null) {
                // No annotation, use delegate
                return delegate.translateName(f);
            } else {
                return key.value();
            }
        }
    }
    

    然后用GsonBuilder注册:

    Gson gson = new GsonBuilder()
        // Uses IDENTITY as delegate, which uses field names as is
        .setFieldNamingStrategy(new KeyFieldNamingStrategy(FieldNamingPolicy.IDENTITY))
        .create();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2020-07-25
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多