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

时间:2017-11-09 07:40:37

标签: java android arrays json android-spinner

我首先要为我使用的术语道歉,因为我对使用Json对象和数组相当陌生。

我搜索了各种可以从Json对象中提取数据的示例,但没有一个类似于我所处的情况。我试图提取字符串“Plan A(经济计划)”,“B计划(豪华计划)“和”计划C(斋月)“来自以下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的微调器中。目前我已经将值硬编码到微调器中,但是这些计划可以改变,我不想每次都对它进行硬编码。

Json对象的格式与平常略有不同,因为API是以这种方式构建的,有没有办法提取不同的计划而不必更改API,因为这需要更多的工作?< / p>

以下是我为实现这一目标而采取的步骤:

  1. String APIUrl =“url for API”
  2. 我将APIUrl连同必要的数据一起发送到DataAPI类,该类扩展了AsyncTask并发送了一个Http POST请求。
  3. 存储在String JsonResult中的服务器响应。
  4. 然后我从字符串中创建了一个jsonObject,并检查了jsonObject.getString("status").equals("success")
  5. 我在这里被卡住,因为我不知道是否有办法提取所需的字符串(“1:计划A(经济计划)”,“2:计划B(豪华计划)”,和“3:计划C(斋月)”)所以我可以拆分(“计划A(经济计划)”,“计划B(豪华计划)”和“计划C(斋月)”)并放入Android微调器。
  6. 非常感谢您的帮助,如果您想要在帖子中包含任何更改或事项,请告知我们。

4 个答案:

答案 0 :(得分:0)

您可以将gson用于此目的:

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

为了让你的json的pojo去: http://www.jsonschema2pojo.org/

将json复制到那里,从右侧面板中选择json,然后选择没有。 之后你必须点击预览它会显示几个类。修改这些类来制作你的json的对象。一旦你拥有了你的类的对象,那么yu可以通过调用object和使用get属性获得任何值。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

如果要添加更多计划,这是完美的,因此这是我坚持的解决方法,直到我找到更好的方法。