栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Gson,JSON和LinkedTreeMap的精妙之处

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gson,JSON和LinkedTreeMap的精妙之处

忘掉Java。您需要首先了解JSON格式。

基本上就是这样

object    {}    { members }members    pair    pair , memberspair    string : valuearray    []    [ elements ]elements    value     value , elementsvalue    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 StringSystem.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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号