1

首先,我是 GSON 的初学者,所以请多多包涵。

我试图从这个 url 读取 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";

感谢您的帮助,感谢您的帮助

4

4 回答 4

6

它很旧,但也许有人仍然需要它......

要序列化名称只是 Integer 的属性,只需制作模型类,如:

杰森:

{
  "name": "foo",
  "1": "value one",
  "2": "value two",
  "3": "value three"
}

爪哇:

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...

}
于 2018-08-11T10:41:58.633 回答
5

您首先需要定义几个类:

麦格森

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
于 2013-09-26T13:04:48.367 回答
4

考虑到contentJSON 对象如下所示:

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

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

private Map<Integer, String> content;

基本上, Map 是一个包含成对的对象key - value,在您的情况下,键是Integer,值是String

因此,您可以访问您的链接以查找要检索的值的键,对于第一个链接,它只是:

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

请注意,这样做可以为链接设置不同的编号。现在你有 1、5 和 6。但你可以有任何整数和任意数量的链接......

于 2013-09-26T13:08:42.957 回答
1

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,则约定会略有变化,将每个字母大写,并用下划线分隔后续单词。按照惯例,下划线字符从不在其他地方使用。

于 2013-09-26T12:59:32.833 回答