首先,我是GSON的初学者,所以请耐心等待。
我试图从这个网址读取一个JSON:
https://gdata.youtube.com/feeds/api/videos?author=radityadika&v=2&alt=jsonc
我成功读取了像“id”,“data”,“uploader”等字符串变量。
但是,我怎样才能阅读content
(items
内)?我想得到RTSP链接(content:1
),但我的Java一直给我错误,因为我不能用变量命名变量,如:
String 1 = "asd";
感谢您的帮助,感谢您的帮助
答案 0 :(得分:5)
首先需要定义几个类:
<强> MyGson 强>
public class MyGson {
private String apiVersion;
private Data data;
public Data getData() {
return data;
}
}
数据强>
public class Data {
private String updated;
private int totalItems = 0;
private int startIndex = 0;
private int itemsPerPage = 0;
private List<Item> items;
public List<Item> getItems() {
return items;
}
}
<强>物品强>
public class Item {
private String id;
private String uploaded;
private String updated;
private String uploader;
private String category;
private String title;
private String description;
private Map<Integer, String> content;
public Map<Integer, String> getContent() {
return content;
}
}
看一下,content
是key
是1,2,3,4,5,6 ....
您可以定义Map<String, String> content
但由于您的所有键都是整数..
所以现在你可以提取你想要的任何值:
<强>启动强>
....
Gson gson = new Gson();
MyGson myGson = gson.fromJson(str, MyGson.class);
List<Item> items = myGson.getData().getItems();
if(items.size()>0){
Item item = items.get(0);
String myStr = item.getContent().get(1);
System.out.println(myStr);
}
输出:
rtsp://r6---sn-cg07lue6.c.youtube.com/CiILENy73wIaGQl1cubZZSUSXxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
答案 1 :(得分:3)
考虑到content
JSON对象如下所示:
"content": {
"1": "someLink",
"5": "someOtherLink",
...
}
解析该JSON对象的最佳方法是Map
(请参阅Map documentation),因此您只需要向Item
类添加一个属性,如下所示:
private Map<Integer, String> content;
基本上,地图是包含key - value
对的对象,在您的情况下,密钥为Integer
,值为String
。
那么你可以访问你的链接,寻找你要检索的值的键,在第一个链接的情况下,它只是:
String someLink = content.get(new Integer(1));
请注意,这样做可以为链接设置不同的数字。现在你有1,5和6.但你可以有任意整数和任意数量的链接......
答案 2 :(得分:2)
它很旧,但也许有人仍然需要它...
要序列化名称仅为Integer的属性,只需使模型类如下:
Json:
{
"name": "foo",
"1": "value one",
"2": "value two",
"3": "value three"
}
Java:
import com.google.gson.annotations.SerializedName;
public class Foo {
private String name;
@SerializedName("1")
private String one;
@SerializedName("2")
private String two;
@SerializedName("3")
private String three;
// standard getter & setters bellow...
}
答案 3 :(得分:1)
Java语言不允许这样的变量命名。
此处引用相关的例外情况,详情请参阅以下链接, http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
每种编程语言都有自己的一套规则和约定 对于您允许使用的名称和Java 编程语言也不例外。的规则和惯例 命名变量可归纳如下:
变量名称区分大小写。变量的名称可以是任何合法标识符 - 无限长度的Unicode字母和序列 数字,以字母开头,美元符号“$”或者 下划线字符“”。然而,该公约始终是开始的 您的变量名称带有字母,而不是“$”或“”。另外, 按照惯例,美元符号字符从未使用过。你可以 找到一些自动生成的名称将包含的情况 美元符号,但您的变量名应始终避免使用它。一个 对于下划线字符存在类似的约定;虽然它是 在技术上合法,用“_”开始变量的名称,这个 不鼓励练习。不允许有空格。
后续字符可以是字母,数字,美元符号或下划线字符。公约(和常识)适用于此 规则也是如此。为变量选择名称时,请使用完整的单词 而不是神秘的缩写。这样做可以使您的代码更容易 阅读和理解。在许多情况下,它也会生成您的代码 自记录文件;例如,名为cadence,speed和gear的字段 比缩写版本更直观,例如s,c和 G。另请注意,您选择的名称不得是关键字或 保留字。
- 醇>
如果您选择的名称只包含一个单词,则以全小写字母拼写该单词。如果它由多个单词组成, 大写每个后续单词的第一个字母。名字 gearRatio和currentGear是这个惯例的主要例子。如果 您的变量存储一个常量值,例如static final int NUM_GEARS = 6,约定略有变化,每个都大写 用下划线字母分隔后续单词。 按照惯例,下划线字符从未在别处使用过。