【问题标题】:How does Gson.fromJson(String, Class) work?Gson.fromJson(String, Class) 是如何工作的?
【发布时间】:2019-05-03 14:23:41
【问题描述】:

考虑以下示例 Json 字符串:

{"Name":"val","FatherName":"val","MotherName":"val"}

我把上面的 Json 转换成下面的 pojo :

public class Info{
    private String name;
    private String father;
    private String mother;
}

我想知道的是,当我执行以下操作时:

Gson.fromJson(jsonLine, Info.class);

json 对象中的键如何跟踪到我的 pojo 中的变量? FatherName中的键FatherName的值是如何存储在father中的Info.class中的?

【问题讨论】:

  • 我怀疑这个 json + pojo 一起工作。刚刚检查:如果您将toString 添加到Info,输出将是“Info{name=null,father=null,mother=null}”,这是预期的,因为 Gson(如预期)无法在此处映射任何内容。

标签: java json gson


【解决方案1】:

Gson 正在使用反射 (https://android.jlelse.eu/reflections-on-reflection-performance-impact-for-a-json-parser-on-android-d36318c0697c)。因此,示例 json 在您的示例中将无法按预期工作,有几个选项可以解决此问题

  1. 将 json 字符串更改为 {"name":"val","father":"val","mother":"val"}
  2. 更改信息类的属性父亲-父亲名称和母亲相同 3 创建自定义序列化程序GSON - Custom serializer in specific case

感谢@Aaron

您也可以使用@SerializedName 注释变量

@SerializedName("父亲") 私有字符串父亲姓名;

【讨论】:

  • 除非我遗漏了一些使用自定义序列化程序的东西,否则会矫枉过正,应该首选@SerializedName
  • 所以我的示例只有在 POJO 的键和成员变量具有相同名称时才有效。但是为了使我的示例正常工作,如何将 json 字符串中的键映射到 pojo 的成员变量?
  • Aaron 应该可以使用 @SerializedName 注释来做到这一点
  • 谢谢,我试图探索,但没有遇到@SerializedName注解。
【解决方案2】:

在 Kotlin 中,有这个类:

import com.google.gson.annotations.SerializedName

data class UsuariosDTO (
@SerializedName("data") var data: List<Usuarios>
    )
data class Usuarios(
@SerializedName("uid") var uid: String,
@SerializedName("name") var name: String,
@SerializedName("email") var email: String,
@SerializedName("profile_pic") var profilePic: String,
@SerializedName("post") var post: Post
)
data class Post(
@SerializedName("id") var id: Int,
@SerializedName("date") var date: String,
@SerializedName("pics") var pics: List<String>
)

我可以使用(其中 dataObteined 是 UsuariosDTO 类型):

val json = gson.toJson(dataObtained)

然后像这样反序列化 json:

val offUsuariosDTO = gson.fromJson(json, UsuariosDTO::class.java)

四处寻找后,我发现我的错误是 UsuariosDTO.class。由于 Gson 是一个 java 库,你必须使用 UsuariosDTO::class.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 2011-04-15
    • 1970-01-01
    • 2020-02-22
    • 2014-04-11
    • 2010-11-27
    • 2012-04-22
    • 2011-01-31
    相关资源
    最近更新 更多