如何使用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; } }
看看,你的content
是key
是1,2,3,4,5,6 ….
您可以定义Map
但因为所有键都是整数。
所以现在你可以提取你想要的任何值:
发射台
.... 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编程语言也不例外。 命名变量的规则和约定可归纳如下:
变量名称区分大小写。 变量的名称可以是任何合法的标识符 – 无限长度的Unicode字母和数字序列,以字母开头,美元符号“$”或下划线字符“ ”。 但是,惯例是始终用字母开头,而不是“$”或“ ”。 此外,按照惯例,美元符号字符根本不会被使用。 您可能会发现某些情况,其中自动生成的名称将包含美元符号,但您的变量名称应始终避免使用它。 对于下划线字符存在类似的约定; 虽然用“_”开始变量的名称在技术上是合法的,但不鼓励这种做法。 不允许有空白区域。
后续字符可以是字母,数字,美元符号或下划线字符。 约定(和常识)也适用于此规则。 为变量选择名称时,请使用完整单词而不是隐藏缩写。 这样做可以使您的代码更易于阅读和理解。 在许多情况下,它还会使您的代码自我记录; 例如,名为cadence,speed和gear的字段比缩写版本(如s,c和g)更直观。 另请注意,您选择的名称不得是关键字或保留字。
如果您选择的名称只包含一个单词,则拼写全部小写字母。 如果它由多个单词组成,则将每个后续单词的首字母大写。 名称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... }
- 将SQLite数据库中的数据显示到Android中的ListView中
- 无法解决Eclipse“归档所需库…”问题
- android:text =“@ string / hello”和普通右键单击 – >文本视图组件 – > EditText之间的区别
- 如何在Android中的onResponse之外使用变量?
- 问题序列化和反序列化ArrayList
- 这个线程一旦完成就会在最后运行时会发生什么?
- Android:以编程方式启用WiFi热点
- Android java.lang.ClassCastException:android.widget.RelativeLayout无法强制转换为android.widget.EditText
- 在移植使用libsndfile编写的C ++代码时,我应该在Android中使用什么?