如何使用GSON读取使用数字作为其名称的JSON变量

首先,我是GSON的初学者,请耐心等待。

我试图从这个url中读取一个JSON:

https://gdata.youtube.com/feeds/api/videos?author=radityadika&v=2&alt=jsonc

我成功读取了一个String变量,如“id”,“data”,“uploader”等。

但是,我如何阅读content (内部items )? 我想得到RTSP链接( content:1 ),但我的Java一直给我错误,因为我不能用变量命名变量,如:

 String 1 = "asd"; 

任何帮助表示赞赏,感谢您的帮助

您首先需要定义几个类:

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 items; public List 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 content; public Map getContent() { return content; } } 

看看,你的contentkey是1,2,3,4,5,6 ….

您可以定义Map content但因为所有键都是整数。

所以现在你可以提取你想要的任何值:

发射台

  .... Gson gson = new Gson(); MyGson myGson = gson.fromJson(str, MyGson.class); List 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 

考虑到content JSON对象如下所示:

 "content": { "1": "someLink", "5": "someOtherLink", ... } 

解析该JSON对象的最佳方法是作为Map (请参阅Map文档 ),因此您只需要向Item类添加一个属性,如下所示:

 private Map content; 

基本上,Map是一个包含键值对的对象,在这种情况下,键是Integer ,值是String

那么你可以访问你的链接,寻找你想要检索的值的键,在第一个链接的情况下,它只是:

 String someLink = content.get(new Integer(1)); 

请注意,这样做可以为链接提供不同的数字。 现在你有1,5和6.但你可以有任意整数和任意数量的链接……

Java语言不允许像这样的变量命名。

此处引用了相关的例外情况,请参阅以下链接了解详细信息, http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

每种编程语言都有自己的规则和约定,适用于您可以使用的各种名称,Java编程语言也不例外。 命名变量的规则和约定可归纳如下:

  1. 变量名称区分大小写。 变量的名称可以是任何合法的标识符 – 无限长度的Unicode字母和数字序列,以字母开头,美元符号“$”或下划线字符“ ”。 但是,惯例是始终用字母开头,而不是“$”或“ ”。 此外,按照惯例,美元符号字符根本不会被使用。 您可能会发现某些情况,其中自动生成的名称将包含美元符号,但您的变量名称应始终避免使用它。 对于下划线字符存在类似的约定; 虽然用“_”开始变量的名称在技术上是合法的,但不鼓励这种做法。 不允许有空白区域。

  2. 后续字符可以是字母,数字,美元符号或下划线字符。 约定(和常识)也适用于此规则。 为变量选择名称时,请使用完整单词而不是隐藏缩写。 这样做可以使您的代码更易于阅读和理解。 在许多情况下,它还会使您的代码自我记录; 例如,名为cadence,speed和gear的字段比缩写版本(如s,c和g)更直观。 另请注意,您选择的名称不得是关键字或保留字。

  3. 如果您选择的名称只包含一个单词,则拼写全部小写字母。 如果它由多个单词组成,则将每个后续单词的首字母大写。 名称gearRatio和currentGear是此约定的主要示例。 如果变量存储常量值,例如static final int NUM_GEARS = 6,则约定会略有变化,将每个字母大写并用后缀字符分隔后续单词。 按照惯例,下划线字符从未在别处使用过。

它已经老了但也许还有人需要它……

要序列化名称只是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... }