(Kotlin 中的 Moshi)@Json 与 @field:Json

Posted

技术标签:

【中文标题】(Kotlin 中的 Moshi)@Json 与 @field:Json【英文标题】:(Moshi in kotlin) @Json vs @field:Json 【发布时间】:2019-11-20 10:22:33 【问题描述】:

当我在字段中使用 @Json 时,序列化没有正确发生,但在更改为 @field:Json 后它开始工作。

我在阅读了一些错误线程后完成了这个更改,我认为这是特定于 kotlin 的。我想知道@field:Json 带来了什么不同,它真的是 kotlin 特有的吗?

【问题讨论】:

【参考方案1】:

无论您在注解中放在 @: 之间的任何内容,都会为您的注解指定准确的 target

在将 Kotlin 与 JVM 结合使用时,会生成大量内容,因此您的 Annotation 可以放在很多地方。如果您没有指定 target,那么您将让 Kotlin 编译器选择应该放置 Annotation 的位置。当你指定target -> 你负责。

为了更好地查看差异,您应该在 IntelliJ/android Studio 中检查 Kotlin 字节码的反编译 Java 代码。


示例 kotlin 代码:

class Example 

    @ExampleAnnotation
    val a: String = TODO()

    @get:ExampleAnnotation
    val b: String = TODO()

    @field:ExampleAnnotation
    val c: String = TODO()

反编译的 Java 代码:

public final class Example 
   @NotNull
   private final String a;
   @NotNull
   private final String b;
   @ExampleAnnotation
   @NotNull
   private final String c;

   /** @deprecated */
   // $FF: synthetic method
   @ExampleAnnotation
   public static void a$annotations() 
   

   @NotNull
   public final String getA() 
      return this.a;
   

   @ExampleAnnotation
   @NotNull
   public final String getB() 
      return this.b;
   

   @NotNull
   public final String getC() 
      return this.c;
   

   public Example() 
      boolean var1 = false;
      throw (Throwable)(new NotImplementedError((String)null, 1, (DefaultConstructorMarker)null));
   


欲了解更多信息,请访问Kotlin docs。

【讨论】:

更多关于它如何影响 Moshi 的信息会更好,因为问题是 Moshi 特定的,而不是注释本身之间的区别。但它有帮助,谢谢:)

以上是关于(Kotlin 中的 Moshi)@Json 与 @field:Json的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Kotlin 的 Room 和 moshi 持久化带有 JSON 数组的 JSON 对象

如何在 moshi (kotlin) 中解析 LinkedHashMap

Kotlin中Json的序列化与反序列化 -- GsonMoshi

Kotlin中Json的序列化与反序列化 -- GsonMoshi

Kotlin中Json的序列化与反序列化 -- GsonMoshi

对kotlin友好的现代 JSON 库 moshi 基本使用和实战