java – Gson,JSON和LinkedTreeMap的微妙之处
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Gson,JSON和LinkedTreeMap的微妙之处,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4154字,纯文字阅读大概需要6分钟。
内容图文
我最近开始玩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\"}}";
我的问题是这些“括号内的括号”如何适用于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 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字符串(缺少“)是以下(使用jsonlint.com格式化)
{
"created_at": "Sat Feb 08 15:37:37 +0000 2014",
"id": "432176397474623489",
"user": {
"id_str": "366301747",
"name": "somethingClever",
"screen_name": "somethingCoolAndClever"
}
}
JSON是一个对象outer {},它包含三对,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
请注意0??7001,以便您可以继续使用字段的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对象,没有名称与名称对.而不是使用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
它会失败,因为用户不是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.
内容总结
以上是互联网集市为您收集整理的java – Gson,JSON和LinkedTreeMap的微妙之处全部内容,希望文章能够帮你解决java – Gson,JSON和LinkedTreeMap的微妙之处所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。