我最近开始使用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\"}}";
我的问题是这些“括号中的括号”如何适用于JSON
的user
部分?
如何将这些内括号中指定的值赋给变量?
谁能给我解释一下,或者用代码演示一下,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);
. print out null
?
5条答案
按热度按时间de90aj5v1#
忘记Java。首先,你需要了解JSON format。
基本上就是这样
第二个JSON
String
(缺少"
)如下所示(使用https://jsonlint.com/进行格式化)JSON是一个对象,外部
{}
,它包含三对,created_at
是JSON字符串,id
也是JSON字符串,user
是JSON对象。这个JSON对象包含另外三对JSON字符串。你问
如何将这些内括号中指定的值赋给变量?
大多数高级JSON解析/生成库都是用来将JSON转换为Pojos并返回的。
所以你可以将JSON格式Map到Java类。
请注意
@SerializedName
x 1 e3f1x,以便您可以继续使用Java命名约定来命名字段。您现在可以将JSON格式化
会打印
显示所有字段都已正确设置。
谁能给我解释一下,或者用代码给我演示一下,Gson是如何处理这样的东西的,以及我如何使用它?
Gson的源代码是免费的。你可以在网上找到。它很复杂,源代码解释不适合这里。简单地说,它使用您提供的
Class
对象来确定如何MapJSON对。它查看相应类的字段。如果这些字段是其他类,那么它会递归,直到它构建了一个Map,Map了它所需要的所有内容。简而言之,为什么. print out null?
因为你的根JSON对象没有一个名为
name
的对。使用Gson的JsonObject
类型而不是Map
。哪个打印
上面的方法类可能抛出了许多异常,如果它们不是正确的类型。例如,如果我们做了
它会失败,因为
user
不是JSON数组。具体来说,它会抛出所以
JsonElement
(JavaDoc)类(它是JsonObject
、JsonArray
和其他一些类的父类)提供了检查它是什么的方法。查看javadoc。ih99xse12#
对于那些来这里寻找一种方法来将LinkedTreeMap转换为对象的人:
当我需要解析一个通用对象时,这对我很有用,比如:
但我不知道服务器要发送哪个对象。objectFull将成为LinkedTreeMap
xxls0lw83#
JSON字符串具有以下结构:
当您使用代码将值放入Map中时:
它具有以下关键价值:
这就是为什么你可以使用
map.get("created_at")
。现在,既然你想得到用户的名字,你需要得到用户的map:
在
userMap
中,您将获得以下键值:现在,您可以获得
user
的name
flmtquvp4#
user
是JsonObject
本身:ie3xauqp5#
首先,JSON是“JavaScript Object Notation”的缩写,所以你关于“JSON字符串本质上是一个Map”的Assert是不正确的。JSON块是使用JavaScript语言语法描述的对象图。由于你试图将一个对象图强制转换为一个String,Sting kay值对的Map,这只会在任何给定的JSON对象图本质上就是这样的情况下起作用(所以不太常见)。一个更成功的策略可能是
gson.fromJson()
,它将把你的JSON转换成一个合适的Java对象图。