2

我是 JSON 新手,我真的很难用 Java 中的 GSON 解析这个布局

{"time_entries":
[
    {"hours":1.0,
    "id":311,
    "created_on":"2012-11-02T14:53:38Z",
    "user":{"id":7,"name":"blah"},
    "issue":{"id":266},
    "activity":{"id":10,"name":"blah"},
    "updated_on":"2012-11-02T14:53:38Z",
    "comments":"blah",
    "spent_on":"2012-11-02",
    "project":{"id":10,"name":"blah"}},

    {"hours":6.0,
    "id":310,
    "created_on":"2012-11-02T13:49:24Z",
    "user":{"id":4,"name":"blah"},
    "issue":{"id":258},
    "activity":{"id":9,"name":"blah"},
    "updated_on":"2012-11-02T13:49:24Z",
    "comments":"blah",
    "spent_on":"2012-11-02",
    "project":{"id":11,"name":"blah"
    }}
],
"offset":0,
"limit":2,
    "total_count":306
}

如果它有帮助,那就是Redmine API 为您提供时间条目的输出。 我正在努力理解一些基本的 JSON 概念,如对象和数组,但我无法找到一个布局与此类似的示例。

在使用我读过的教程时,我主要担心的是多个 ID 字段会混淆。

解析这个而不会让自己陷入困境的最佳方法是什么?

我不打算使用 Gson,我很乐意使用 Jackson 或内置库的解决方案。最终目标是 Android 实现,所以我更喜欢使用序列化。

谢谢

编辑:

我对“对象模型”的尝试

public class TimeResponse {
     public List<Time_Entry> time_entries;

        @SerializedName("hours")
        public String hours;

        @SerializedName("id")
        public int id;

        @SerializedName("created_on")
        public String created_on;

        @SerializedName("name")
        public String name;

        @SerializedName("updated_on")
        public int updated_on;

        public int page;

        @SerializedName("comments")
        public double comments;

        @SerializedName("spent_on")
        public String spent_on;

        @SerializedName("offset")
        public String offset;

        @SerializedName("limit")
        public String limit;

        @SerializedName("total_count")
        public String total_count;

}

我不确定我应该为我的结果列表写什么(如果我需要的话)并且我只声明了一次 id 和 name 字符串,尽管它被多次使用?

我知道我不应该在我的时间里使用字符串我正在研究小时字段实际包含的内容。我相信本教程有点过时了,因为最后三个字段现在在 Twitter API 中的表示方式不同。

4

2 回答 2

3

我不确定您所说的“多个 ID 字段”是什么意思。JSON 中没有 ID 之类的东西。

关于基本 JSON 概念,请参阅http://json.org/

目的:

对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

大批:

数组是值的有序集合。数组以 [(左括号)开头,以 ](右括号)结尾。值用 ,(逗号)分隔。

价值:

值可以是双引号中的字符串、数字、true 或 false 或 null,也可以是对象或数组。这些结构可以嵌套。

细绳:

字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串与 C 或 Java 字符串非常相似。

数字:

数字与 C 或 Java 数字非常相似,只是不使用八进制和十六进制格式。

编辑:

除了漂亮地打印它之外,您无法从问题中简化 JSON:

{
    "time_entries": [
        {
            "hours": 1,
            "id": 311,
            "created_on": "2012-11-02T14:53:38Z",
            "user": {
                "id": 7,
                "name": "blah"
            },
            "issue": {
                "id": 266
            },
            "activity": {
                "id": 10,
                "name": "blah"
            },
            "updated_on": "2012-11-02T14:53:38Z",
            "comments": "blah",
            "spent_on": "2012-11-02",
            "project": {
                "id": 10,
                "name": "blah"
            }
        },
        {
            "hours": 6,
            "id": 310,
            "created_on": "2012-11-02T13:49:24Z",
            "user": {
                "id": 4,
                "name": "blah"
            },
            "issue": {
                "id": 258
            },
            "activity": {
                "id": 9,
                "name": "blah"
            },
            "updated_on": "2012-11-02T13:49:24Z",
            "comments": "blah",
            "spent_on": "2012-11-02",
            "project": {
                "id": 11,
                "name": "blah"
            }
        }
    ],
    "offset": 0,
    "limit": 2,
    "total_count": 306
}

也许您可以看到您有一个 JSON对象,其中包含四个名称/值对:

  • time_entries
  • offset
  • limit
  • total_count

其中最后三个具有简单的数值,而第一个 ( time_entries) 是另外两个Objects的Array。这两个对象中的每一个都包含各种名称/值对。名称/值对只是其中之一。id

于 2012-11-05T13:59:51.250 回答
1

数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组

我在这里使用了javascript..它可能对你有用..如果你有任何其他帮助让我知道

var jsonText = xmlhttp.responseText; var obj = eval ("(" + jsonText + ")");

row_num=Object.keys(obj.time_entries).length; 此行给出 time_entries 数组长度的长度

keydata[c]=Object.keys(obj.time_entries[0]); columndata=keydata[0].toString(); my = columndata.split(",");

columndata 包含时间条目的键值作为该数组中第 0 个索引的字符串 columnndata={hours,id,create_on..... 等等} my={"hours","id".... 等等}

于 2013-03-06T12:16:06.667 回答