android - 如何使用嵌套的 Json 数组响应解析 Json 对象
问题描述
我是 Android 中 Api 的新手。我使用 Json 对象处理 Api 响应,但没有使用嵌套对象。我很困惑如何使用 Json 对象中的嵌套 Json 数组来做到这一点。我看到了一些教程,但仍然感到困惑。
例如。以下是我的 Json 回复:
{
"results": {
"next": "https://places.demo.api.here.com/places/v1/discover/search;context=Zmxvdy1pZD03NzgzMWY5My1hMTc3LTU1MzYtOTc0YS1lYjcyYTBmMGZjN2NfMTUzODMzOTIxMDExM184NTM0XzU0MzUmb2Zmc2V0PTIwJnNpemU9MjA?at=37.7942%2C-122.407&q=police-emergency&app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"items": [
{
"position": [
37.79855,
-122.40986
],
"distance": 545,
"title": "San Francisco Police Dept-Central",
"averageRating": 0,
"category": {
"id": "police-station",
"title": "Police Station",
"href": "https://places.demo.api.here.com/places/v1/categories/places/police-station?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.cit.data.here.com/p/d/places2_stg/icons/categories/19.icon",
"vicinity": "766 Vallejo St<br/>San Francisco, CA 94133",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.demo.api.here.com/places/v1/places/8409q8zn-a0b398e1a4664f458efe8a4cd3115bc5;context=Zmxvdy1pZD03NzgzMWY5My1hMTc3LTU1MzYtOTc0YS1lYjcyYTBmMGZjN2NfMTUzODMzOTIxMDExM184NTM0XzU0MzUmcmFuaz0w?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"id": "8409q8zn-a0b398e1a4664f458efe8a4cd3115bc5",
"alternativeNames": [
{
"name": "Central District Police Station",
"language": "en"
},
{
"name": "Police Department",
"language": "en"
}
]
},
{
"position": [
37.79158,
-122.40228
],
"distance": 507,
"title": "Wang & Wang",
"averageRating": 0,
"category": {
"id": "police-station",
"title": "Police Station",
"href": "https://places.demo.api.here.com/places/v1/categories/places/police-station?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.cit.data.here.com/p/d/places2_stg/icons/categories/19.icon",
"vicinity": "250 Montgomery St<br/>San Francisco, CA 94104",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.demo.api.here.com/places/v1/places/8409q8yy-18f83a71fbab46c0b04fc2838ebf7867;context=Zmxvdy1pZD03NzgzMWY5My1hMTc3LTU1MzYtOTc0YS1lYjcyYTBmMGZjN2NfMTUzODMzOTIxMDExM184NTM0XzU0MzUmcmFuaz0x?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"id": "8409q8yy-18f83a71fbab46c0b04fc2838ebf7867",
"openingHours": {
"text": "Mon-Fri: 08:30 - 17:00",
"label": "Opening hours",
"isOpen": false,
"structured": [
{
"start": "T083000",
"duration": "PT08H30M",
"recurrence": "FREQ:DAILY;BYDAY:MO,TU,WE,TH,FR"
}
]
}
},
{
"position": [
37.78366,
-122.4129
],
"distance": 1282,
"title": "San Francisco Police-Tenderloin",
"averageRating": 0,
"category": {
"id": "police-station",
"title": "Police Station",
"href": "https://places.demo.api.here.com/places/v1/categories/places/police-station?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.cit.data.here.com/p/d/places2_stg/icons/categories/19.icon",
"vicinity": "301 Eddy St<br/>San Francisco, CA 94102",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.demo.api.here.com/places/v1/places/8409q8yy-d7bbb787aa58418c917d531a5b2a51b0;context=Zmxvdy1pZD03NzgzMWY5My1hMTc3LTU1MzYtOTc0YS1lYjcyYTBmMGZjN2NfMTUzODMzOTIxMDExM184NTM0XzU0MzUmcmFuaz0xNA?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"id": "8409q8yy-d7bbb787aa58418c917d531a5b2a51b0",
"alternativeNames": [
{
"name": "Police Department",
"language": "en"
},
{
"name": "SFPD - Tenderloin Station",
"language": "en"
}
]
},
{
"position": [
37.81885,
-122.26497
],
"distance": 12775,
"title": "Vigelant Pro Private Security",
"averageRating": 0,
"category": {
"id": "police-emergency",
"title": "Police/Emergency",
"href": "https://places.demo.api.here.com/places/v1/categories/places/police-emergency?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.cit.data.here.com/p/d/places2_stg/icons/categories/19.icon",
"vicinity": "411 30th St<br/>Oakland, CA 94609",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.demo.api.here.com/places/v1/places/8403fv6k-0c72e65d7d660fb3b53e5021d92b1283;context=Zmxvdy1pZD03NzgzMWY5My1hMTc3LTU1MzYtOTc0YS1lYjcyYTBmMGZjN2NfMTUzODMzOTIxMDExM184NTM0XzU0MzUmcmFuaz0xOQ?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg",
"id": "8403fv6k-0c72e65d7d660fb3b53e5021d92b1283"
}
]
},
"search": {
"context": {
"location": {
"position": [
37.7942,
-122.407
],
"address": {
"text": "818 Clay St<br/>San Francisco, CA 94108<br/>USA",
"house": "818",
"street": "Clay St",
"postalCode": "94108",
"district": "Chinatown",
"city": "San Francisco",
"county": "San Francisco",
"stateCode": "CA",
"country": "United States",
"countryCode": "USA"
}
},
"type": "urn:nlp-types:place",
"href": "https://places.demo.api.here.com/places/v1/places/loc-dmVyc2lvbj0xO3RpdGxlPTgxOCtDbGF5K1N0O2xhdD0zNy43OTQyO2xvbj0tMTIyLjQwNztzdHJlZXQ9Q2xheStTdDtob3VzZT04MTg7Y2l0eT1TYW4rRnJhbmNpc2NvO3Bvc3RhbENvZGU9OTQxMDg7Y291bnRyeT1VU0E7ZGlzdHJpY3Q9Q2hpbmF0b3duO3N0YXRlQ29kZT1DQTtjb3VudHk9U2FuK0ZyYW5jaXNjbztjYXRlZ29yeUlkPWJ1aWxkaW5nO3NvdXJjZVN5c3RlbT1pbnRlcm5hbA;context=c2VhcmNoQ29udGV4dD0x?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg"
},
"supportsPanning": true,
"ranking": "category-recommendations"
}
}
我知道外部大括号表示对象,而其他方括号是 json 数组,但我很困惑如何解析它。我使用 Retrofit lib tho
更新:
我尝试使用 POJO,但是当我调试应用程序时,断点在 ApiInterface 对象创建时中断,没有任何消息。早些时候我在正文中得到了 null 而没有任何错误(我已经硬编码了我想在 @PATH 中传递的值)。
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<Results> call = apiService.getALlData();
call.enqueue(new Callback<Results>() {
@Override
public void onResponse(Call<Results> call, Response<Results> response) {
ArrayList<Item> items = response.body().getItems();
rc.setAdapter(new DataAdapter(getApplicationContext(), items));
}
@Override
public void onFailure(Call<Results> call, Throwable t) {
}
});
- 当我尝试使用带有值的 @Path 时,我的 Url 给出错误(不能有替换块。对于动态查询参数,请使用 @Query。)
我的网址: https : //places.cit.api.here.com/places/v1/discover/search?at= {LAT/LONG}&q=police-emergency&Accept-Language=en-US%2Cen%3Bq%3D0。 9&app_id={APP_ID}&app_code={AP_CODE}
我导致的实施不起作用。
@GET("search?at={latlong}&q=police-emergency&Accept-Language=en-US%2Cen%3Bq%3D0.9&app_id=********&app_code=**********")
Call<Results> getAllData(@Path("") String s);
任何概念或帮助将不胜感激.. 提前致谢。
解决方案
Json 数组被解析为 ArrayList,对于您的代码,您需要这样的内容:
public class QueryResult {
private Results results;
private Search search;
/* getters and setters */
}
class Results{
private String next;
private ArrayList<Item> items;
/* getters and setters */
}
class Item{
private ArrayList<Float> position;
private int distance;
private String title;
private int averageRating;
private Category category;
(...)
}
然后,您需要创建一个 Category 对象及其字段等。
最后,您可以拨打改造电话:
call.enqueue(new Callback<QueryResult>() {
@Override
public void onResponse(Call<QueryResult> call, Response<QueryResult> response) {
QueryResult result = response.body()
}
@Override
public void onFailure(Call<QueryResult> call, Throwable t) {
}
});
推荐阅读
- jmeter - 如何避免 Blazemeter 中的随机“oajcIncludeController: loadIncludedElements -failed for:”错误
- android - gradle 文件配置以 android API 22 为目标
- android - android - 所有设备都支持哪种 MediaRecorder 配置?
- javascript - Angular:ControlValueAccessor 更新到共享相同 formControlName 的所有组件
- mysql - 使用sql按组计算百分比
- vb.net - 在 tabPage 控件中动态垂直滚动
- python - 将 numpy 数组的行划分为存储桶
- javascript - 引诱报告随着时间的推移而增长并需要更长的时间来生成
- highcharts - 使用 Highcharts API 在散点图中设置背景文本
- php - 运行长 php 脚本的最佳实践