gpt4 book ai didi

java - Gson、JSON 和 LinkedTreeMap 的精妙之处

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:02 25 4
gpt4 key购买 nike

我最近开始研究 JSON 字符串,有人告诉我 Google 自己的库 Gson 是处理这些字符串的新潮方式。

我的理解是,JSON 字符串本质上是一张 map 。其中每个变量指向字符串中的一个值。

例如:

String jsonInput2 = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\"}

到目前为止,一切都很好。可以使用以下代码将诸如此 JSON 字符串创建时间之类的信息分配给变量:

Gson gson = new Gson();

Map<String, String> map = new HashMap<String, String>();

map = (Map<String, String>) gson.fromJson(jsonInput, map.getClass());

String createdAt = map.get("created_at");

它在简单的美中几乎是艺术的。但这就是美丽的终结和我的困惑开始的地方。

以下是上述JSON字符串的扩展;

String jsonInput2 = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\",\"user\":{\"id_str\":\"366301747\",\"name\":\"somethingClever\",\"screen_name\":\"somethingCoolAndClever\"}}";

我的问题是这些“括号中的括号”如何用于 JSONuser 部分?

如何将这些内括号中指定的值分配给变量?

谁能给我解释一下,或者用代码告诉我,Gson 是如何处理这样的事情的,我该如何使用它?

简而言之,为什么...

String jsonInput = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\",\"user\":{\"id_str\":\"366301747\",\"name\":\"somethingClever\",\"screen_name\":\"somethingCoolAndClever\"}}";

Gson gson = new Gson();

Map<String, String> map = new HashMap<String, String>();

map = (Map<String, String>) gson.fromJson(jsonInput, map.getClass());

String name = map.get("name");

System.out.println(name);

...打印出null?

最佳答案

忘记 Java。你需要先了解JSON format .

基本上就是这样

object
{}
{ members }
members
pair
pair , members
pair
string : value
array
[]
[ elements ]
elements
value
value , elements
value
string
number
object
array
true
false
null

您的第二个 JSON String(缺少一个 ")如下(使用 jsonlint.com 进行格式化)

{
"created_at": "Sat Feb 08 15:37:37 +0000 2014",
"id": "432176397474623489",
"user": {
"id_str": "366301747",
"name": "somethingClever",
"screen_name": "somethingCoolAndClever"
}
}

JSON 是一个对象,外部 {},包含三对,created_at 是一个 JSON 字符串,id 也是一个 JSON 字符串,user 是一个 JSON 对象。该 JSON 对象包含另外三对,它们都是 JSON 字符串。

你问

How could I assign the values specified within these inner-brackets to variables?

大多数高级 JSON 解析/生成库旨在将 JSON 转换为 Pojos 并返回。

因此您可以将 JSON 格式映射到 Java 类。

class Pojo {
@SerializedName("created_at")
private String createdAt;
private String id;
private User user;
}

class User {
@SerializedName("id_str")
private String idStr;
private String name;
@SerializedName("screen_name")
private String screenName;
}

// with appropriate getters, setters, and a toString() method

注意 @SerializedName这样您就可以继续为您的字段使用 Java 命名约定。

您现在可以反序列化您的 JSON

Gson gson = new Gson();
Pojo pojo = gson.fromJson(jsonInput2, Pojo.class);
System.out.println(pojo);

会打印

Pojo [createdAt=Sat Feb 08 15:37:37 +0000 2014, id=432176397474623489", user=User [idStr=366301747, name=somethingClever, screenName=somethingCoolAndClever]]

显示所有字段都已正确设置。

Can anyone explain to me, or show me in code, how Gson handles stuff like this, and how I can use it?

Gson 的源代码是免费提供的。你可以在网上找到它。它很复杂,源代码解释不适合这里。简而言之,它使用您提供的 Class 对象来确定它将如何映射 JSON 对。它查看相应类的字段。如果这些字段是其他类,那么它会重复出现,直到它构建了一个包含所有需要反序列化的映射。


In short, why does...print out null?

因为您的根 JSON 对象没有一对名为 name 的对象。不使用 Map,而是使用 Gson 的 JsonObject 类型。

JsonObject jsonObject = new Gson().fromJson(jsonInput2, JsonObject.class);

String name = jsonObject.get("user") // get the 'user' JsonElement
.getAsJsonObject() // get it as a JsonObject
.get("name") // get the nested 'name' JsonElement
.getAsString(); // get it as a String
System.out.println(name);

打印

somethingClever

如果类型不正确,上述方法类可能会抛出许多异常。例如,如果我们完成了

String name = jsonObject.get("user")       // get the 'user' JsonElement
.getAsJsonArray() // get it as a JsonArray

它会失败,因为 user 不是 JSON 数组。具体来说,它会抛出

Exception in thread "main" java.lang.IllegalStateException: This is not a JSON Array.
at com.google.gson.JsonElement.getAsJsonArray(JsonElement.java:106)
at com.spring.Example.main(Example.java:19)

所以 JsonElement类(它是 JsonObjectJsonArray 和其他一些类的父类)提供了检查它是什么的方法。请参阅 javadoc。

关于java - Gson、JSON 和 LinkedTreeMap 的精妙之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com