在 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 因为这需要更多工作?
以下是我为实现这一目标所遵循的步骤:
- 字符串APIUrl = "url for API"
- 我正在将 APIUrl 连同必要的数据一起发送到 class DataAPI,它扩展了 AsyncTask 并发送了一个 Http POST 请求.
- 服务器响应存储在字符串中Json结果。
- 然后我从字符串创建了一个 jsonObject 并检查是否
jsonObject.getString("status").equals("success")
- 我在这里卡住了,因为我不知道是否有办法提取所需的字符串 ("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;
如果要添加更多计划,这将非常有效,因此这是我一直坚持的解决方法,直到我找到更好的方法。
首先,我想为我使用的术语道歉,因为我对使用 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 因为这需要更多工作?
以下是我为实现这一目标所遵循的步骤:
- 字符串APIUrl = "url for API"
- 我正在将 APIUrl 连同必要的数据一起发送到 class DataAPI,它扩展了 AsyncTask 并发送了一个 Http POST 请求.
- 服务器响应存储在字符串中Json结果。
- 然后我从字符串创建了一个 jsonObject 并检查是否
jsonObject.getString("status").equals("success")
- 我在这里卡住了,因为我不知道是否有办法提取所需的字符串 ("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;
如果要添加更多计划,这将非常有效,因此这是我一直坚持的解决方法,直到我找到更好的方法。