【问题标题】:Extracting data from a JSON format obtained from an API, in JAVA在 JAVA 中从 API 获取的 JSON 格式中提取数据
【发布时间】:2017-11-10 18:43:24
【问题描述】:

首先我要为我使用术语表示歉意,因为我对使用 Json 对象和数组还很陌生。

我已经搜索了可以从 Json 对象中提取数据的各种示例,但没有一个与我所处的情况相似。我正在尝试提取字符串“Plan A(经济计划)”、“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 创建的,我想动态地将不同的“计划”放在 Android 中的微调器中。目前我已将值硬编码到微调器中,但计划的数量可能会发生变化,我不想每次都对其进行硬编码。

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

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

  1. String APIUrl = "API 的 URL"
  2. 我将 APIUrl 与必要的数据一起发送到 DataAPI 类,该类扩展 AsyncTask 并发送 Http POST 请求。
  3. 存储在字符串 JsonResult 中的服务器响应。
  4. 然后我从字符串中创建了一个 jsonObject 并检查是否有jsonObject.getString("status").equals("success")
  5. 我在这里卡住了,因为我不知道是否有办法提取所需的字符串(“1:Plan A(经济计划)”,“2:Plan B(豪华计划)”,和“3:C 计划(斋月)”),以便我可以拆分(“A 计划(经济计划)”、“B 计划(豪华计划)”和“C 计划(斋月)”)并放入 Android 微调器。

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

【问题讨论】:

  • 由于计划的数量可以改变你不能将那个json转换成pojo,我认为你应该使用Map,你可以看一个类似于你的问题的例子here

标签: java android arrays json android-spinner


【解决方案1】:

您可以为此目的使用 gson:

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

让你的 json 的 pojo 转到: http://www.jsonschema2pojo.org/

在那里复制你的 json 并从右侧面板中选择 json 并且没有。 之后,您必须单击预览,它将显示几个类。Creste 这些类以创建您的 json 对象。一旦你有了你的类的对象,你就可以通过调用 object 和使用 get 属性在任何地方获取任何值。

【讨论】:

  • 希望对您有所帮助。如需进一步帮助,请发短信给我。如果它有效,请不要忘记将此帖子标记为答案:)
【解决方案2】:

您可以使用 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);

【讨论】:

    【解决方案3】:

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

    "data" 必须是 jsonArray 才能实现你想要的,所以你可以简单地对其进行迭代,但是 "data" 现在是 jsonObject 并且有这三个计划,你必须知道它们每个的键是什么。 简而言之,制作“数据”JsonArray 而不是 jsonObject 或者给你这个 API 的人告诉他改变它,这样迭代起来很容易

    【讨论】:

      【解决方案4】:

      非常感谢大家的回复。我想发布我最终做的事情,因为我对 Gson、Pojo、Retrofit 等缺乏经验。希望我能更深入地挖掘并学习如何使用这些东西。无论如何,我将 Json 对象转换为字符串,然后使用 Pattern 编译器提取我需要的字符串。然后我将它们放入一个名为 plan 的 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;
      

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

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 2021-05-23
        • 2019-04-04
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多