Gson.fromJson(String,Class)是如何工作的?

a11xaf1n  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(184)

请考虑以下示例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中的键father的值存储在Info.class中?

4jb9z9bj

4jb9z9bj1#

Gson正在使用反射(https://android.jlelse.eu/reflections-on-reflection-performance-impact-for-a-json-parser-on-android-d36318c0697c)。因此示例json将无法按预期工作。在您的示例中,有几个选项可以解决此问题
1.将json字符串更改为{“名称”:“瓦尔”,“父亲”:“值”,“母亲”:“值”}
1.更改info类father-fatherName中的属性,并对mother 3进行相同的更改。创建自定义序列化程序GSON - Custom serializer in specific case
感谢@Aaron
您还可以使用@SerializedName对变量进行注解
@SerializedName(“父亲”)私有字符串父名称;

1u4esq0p

1u4esq0p2#

在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

相关问题