Gson,JSON和LinkedTreeMap的精妙之处
最近,我开始研究JSON
字符串,并被告知Google自己的库Gson
,是处理这些字符串的新方法。
据我了解,JSON
字符串本质上是一个映射。每个变量指向字符串中的值的位置。
例如:
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\"}}";
我的问题是这些“括号内的括号”如何用于user
“ JSON
?” 部分?
我如何将这些内部括号中指定的值分配给变量?
谁能向我解释或向我展示代码,如何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格式。
基本上就是这样
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是一个对象external
{}
,它包含三对,created_at
这是JSON字符串,id
也是JSON字符串,并且user
是JSON对象。该JSON对象包含另外三对都是JSON字符串。
你问
我如何将这些内部括号中指定的值分配给变量?
最高级的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]]
显示所有字段均已正确设置。
谁能向我解释,或向我展示代码,Gson如何处理此类事情以及如何使用?
Gson的源代码可免费获得。您可以在线找到它。这很复杂,源代码解释在这里不适合。简而言之,它使用Class
您提供的对象来确定如何映射JSON对。它查看相应类的字段。如果这些字段是其他类,则它将重复进行,直到构造出需要反序列化的所有内容的映射为止。
简而言之,为什么…打印为空?
因为您的根JSON对象没有与name配对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
类(这是父类的JsonObject
,JsonArray
和其他几个人)提供了一些方法来检查它是什么。参见javadoc。
以上是 Gson,JSON和LinkedTreeMap的精妙之处 的全部内容, 来源链接: utcz.com/qa/432286.html