在 JAVA 中从 API 获得的 JSON 格式提取数据

Extracting data from a JSON format obtained from an API, in JAVA

首先,我想为我使用的术语道歉,因为我对使用 Json 对象和数组还很陌生。

我已经搜索了各种可以从 Json 对象中提取数据的示例,但是 none 与我所处的情况类似。我正在尝试提取字符串 "Plan A (Economy Plan)"、"Plan B (Deluxe Plan)" 和 "Plan C (Ramadan)" 来自以下 Json:

{
"status": "success",
"data": {
    "1:Plan A (Economy Plan)": [{
        "idscheme": "49",
        "plan_name": "1",
        "plan_id": "ABS-772",
        "term": "8",
        "payment": "1000",
        "amount": "8000",
        "expected_amount": null,
        "added_by": "2",
        "updated_on": "2017-09-27"
    }, {
        "idscheme": "50",
        "plan_name": "1",
        "plan_id": "ABS-773",
        "term": "8",
        "payment": "2000",
        "amount": "16000",
        "expected_amount": null,
        "added_by": "1",
        "updated_on": "2017-09-28"
    }, {
        "idscheme": "48",
        "plan_name": "1",
        "plan_id": "ABS-762",
        "term": "7",
        "payment": "4000",
        "amount": "28000",
        "expected_amount": null,
        "added_by": "1",
        "updated_on": "2017-09-28"
    }],
    "2:Plan B (Deluxe Plan)": [{
        "idscheme": "33",
        "plan_name": "2",
        "plan_id": "ABS-486",
        "term": "8",
        "payment": "2000",
        "amount": "16000",
        "expected_amount": null,
        "added_by": "2",
        "updated_on": "2017-09-27"
    }, {
        "idscheme": "47",
        "plan_name": "2",
        "plan_id": "ABS-831",
        "term": "7",
        "payment": "3000",
        "amount": "21000",
        "expected_amount": null,
        "added_by": "2",
        "updated_on": "2017-09-27"
    }, {
        "idscheme": "46",
        "plan_name": "2",
        "plan_id": "ABS-776",
        "term": "7",
        "payment": "4000",
        "amount": "28000",
        "expected_amount": null,
        "added_by": "2",
        "updated_on": "2017-09-27"
    }],
    "5:Plan C (Ramadan)": [{
        "idscheme": "51",
        "plan_name": "5",
        "plan_id": "ABS-865",
        "term": "7",
        "payment": "3000",
        "amount": "21000",
        "expected_amount": null,
        "added_by": "42",
        "updated_on": "2017-10-15"
    }, {
        "idscheme": "52",
        "plan_name": "5",
        "plan_id": "ABS-389",
        "term": "8",
        "payment": "4000",
        "amount": "32000",
        "expected_amount": null,
        "added_by": "42",
        "updated_on": "2017-10-15"
    }, {
        "idscheme": "53",
        "plan_name": "5",
        "plan_id": "ABS-451",
        "term": "8",
        "payment": "5000",
        "amount": "40000",
        "expected_amount": null,
        "added_by": "42",
        "updated_on": "2017-10-15"
    }]
},
"plancount": 3

}

这个 Json 对象是通过使用 API 创建的,我想动态地将不同的 "plans" 放入 [=49= 的微调器中].目前,我已将这些值硬编码到微调器中,但计划的数量可能会发生变化,我不想每次都对其进行硬编码。

Json 对象的格式与通常的格式略有不同,因为 API 是以这种方式构建的,有没有一种方法可以提取不同的计划而不是必须更改 API 因为这需要更多工作?

以下是我为实现这一目标所遵循的步骤:

  1. 字符串APIUrl = "url for API"
  2. 我正在将 APIUrl 连同必要的数据一起发送到 class DataAPI,它扩展了 AsyncTask 并发送了一个 Http POST 请求.
  3. 服务器响应存储在字符串中Json结果。
  4. 然后我从字符串创建了一个 jsonObject 并检查是否 jsonObject.getString("status").equals("success")
  5. 我在这里卡住了,因为我不知道是否有办法提取所需的字符串 ("1:Plan A (Economy Plan)", "2:Plan B (Deluxe Plan) ”和“3:C 计划(斋月)”)这样我就可以拆分("Plan A (Economy Plan)"、"Plan B (Deluxe Plan)" 和 "Plan C (Ramadan)")并放入 Android 微调器中。

非常感谢您的帮助,如果您想要我在 post 中包含任何更改或内容,请告诉我。

您可以为此目的使用 gson:

Gson gson = new Gson();
YourPojoOfJson yourObjectOfPojo = gson.fromJson(jsonObject,YourPojoOfJson .class);

要制作 json 的 pojo,请访问: http://www.jsonschema2pojo.org/

将您的 json 复制到那里,然后从右侧面板复制 select json 和 none。 之后您必须单击预览,它会显示几个 classes.Creste 这些 class 对象来制作您的 json 对象。一旦你有了你的 class 的对象,你就可以通过调用对象和使用 get 属性.

在任何地方获取任何值

您可以使用 Retrofit (http://square.github.io/retrofit/) 发送异步 HTTP POST 请求并将响应转换为 pojo。

示例:

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

我没有足够的声誉来写评论所以我会告诉你我的笔记:

"data" 必须是 jsonArray 才能实现您想要的,因此您可以简单地对其进行迭代,但 "data" 现在是 jsonObject 并且具有这三个计划,您必须知道每个计划的关键。 简而言之,使 "data" JsonArray insteadOf jsonObject 或给你这个 API 的人告诉他更改它,并且很容易对其进行迭代

非常感谢你们的回复。我想 post 我最终做了什么,因为我对 Gson、Pojo、Retrofit 等没有经验。希望我能更深入地研究并学习如何使用这些东西。无论如何,我将 Json 对象转换为字符串,然后使用模式编译器提取我需要的字符串。然后我将它们放在一个名为 plans 的 ArrayList 中。

String temp = jsonObject.getJSONObject("data").toString();

Pattern p = Pattern.compile("\"(.*?)\":\[");
Matcher m = p.matcher(temp);

m.find();

plans.add(m.group(1));

p = Pattern.compile("],\"(.*?)\":\[");
m = p.matcher(temp);

while (m.find()){

    plans.add(m.group(1));

}

status = true;

return plans;

如果要添加更多计划,这将非常有效,因此这是我一直坚持的解决方法,直到我找到更好的方法。