如何在对象键为数字时创建Java getter和setter
我无法创建Java Getters和Setters,因为我的Object Key有数字(数字)。 我将向您展示我的API响应。 如何在不更改API的情况下实现此目的。
{"api_status": true, "message": "", "data": { "0": { "id": "aaa", "name": "aaa", "address": "aaa", "category": "aaa", "open_24_hours": "aaa", "business_open": "", "business_close": "", "type": "0", "title": null, "latitude": "6.8729428", "longitude": "79.8689013", "city": "", "distance": "2.95555089735992" }, "1": { "id": "bbb", "name": "bbb", "address": "bbb", "category": "bbb", "open_24_hours": "bbb", "business_open": "", "business_close": "", "type": "0", "title": null, "latitude": "6.8767581", "longitude": "79.8674747", "city": "", "distance": "2.915385898910569" }, } }
使用下面的类,并使用您的json数据和类作为模型将其传递给GSON库。 你将获得你的模型,每个数据项都使用哈希表进行映射,其中key是你表示为字符串的数字。通过迭代哈希映射,你将获得keySet,这是你在json的数据键中的所有键。 并且对于每个键,您可以获得itemData。
class JsonStructure{ public boolean api_status; public String message HashMap data; } class ItemsData{ public String id; public String name; public String address; public String category; public String open_24_hours; public String business_open; public String business_close; public String type; public String title; public String latitude; public String longitude; public String city; public String distance; }
对于改造Build
BuildRetrofit(){ mOkHttpClient = new OkHttpClient.Builder() .addInterceptor(interceptor) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build(); mConverterFactory = GsonConverterFactory.create(); String baseUrl = "http://dev.appslanka.com/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(mOkHttpClient) .addConverterFactory(mConverterFactory) .build(); mApi = retrofit.create(ApiInterface.class); }
在ApiInterface中定义yoyr请求方法
interface ApiInterface{ @GET("_test/placeInDistance/") Call getResponseForApiCall(); }
现在将此方法称为改进调用结构:
Call call = mApi.getResponseForApiCall(); Response response = call.execute();
解析此响应如下:
HashMap map = response .data; Set s = map.keySet(); Iterator i = s.iterator(); while (i.hasNext()){ String key = i.next(); ItemsData data = map.get(key); String id = data.id; String name = data.name; String address = data.address; String category = data.category; String open24Hr = data.open_24_hours; String businessOpen = data.business_open; String close = data.business_close; String latitue = data.latitude; ..... etc }
是的你可以。 像这样使用SerializedName
注释:
@SerializedName("0") private MyClass myObject;
MyClass
将代表您正在获取的数据的POJO
。
我只想指出,更好的解决方案是更改API (因为这个响应很奇怪),返回一个列表而不是一个带有数字键的对象,但我可以看到你在问题中写道你不能改变它。
如果你真的需要解析这个JSON。 使用定制解决方案 例如我的解决方案。 使用以下代码创建类Response:
import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class Response { public boolean apiStatus; public String message; public List datas; public Response(JSONObject jsonObject) { apiStatus = jsonObject.optBoolean("api_status"); message = jsonObject.optString("message"); datas = new ArrayList<>(); try { JSONObject datasJSON = jsonObject.getJSONObject("data"); int index = 0; while (datasJSON.has(String.valueOf(index))) { JSONObject dataJSON = datasJSON.getJSONObject(String.valueOf(index)); datas.add(new Data(dataJSON)); index++; } } catch (JSONException e) { e.printStackTrace(); } } @Override public String toString() { return "Response{" + "apiStatus=" + apiStatus + ", message='" + message + '\'' + ", datas=" + datas + '}'; } }
使用以下代码创建类数据:
import org.json.JSONObject; public class Data { public String id; public String name; public String address; public String category; public String open24Hours; public String businessOpen; public String businessClose; public String type; public String title; public String latitude; public String longitude; public String city; public String distance; public Data(JSONObject jsonObject) { id = jsonObject.optString("id"); name = jsonObject.optString("name"); address = jsonObject.optString("address"); category = jsonObject.optString("category"); open24Hours = jsonObject.optString("open_24_hours"); businessOpen = jsonObject.optString("business_open"); businessClose = jsonObject.optString("business_close"); type = jsonObject.optString("type"); title = jsonObject.optString("title"); latitude = jsonObject.optString("latitude"); longitude = jsonObject.optString("longitude"); city = jsonObject.optString("city"); distance = jsonObject.optString("distance"); } @Override public String toString() { return "Data{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", address='" + address + '\'' + ", category='" + category + '\'' + ", open24Hours='" + open24Hours + '\'' + ", businessOpen='" + businessOpen + '\'' + ", businessClose='" + businessClose + '\'' + ", type='" + type + '\'' + ", title='" + title + '\'' + ", latitude='" + latitude + '\'' + ", longitude='" + longitude + '\'' + ", city='" + city + '\'' + ", distance='" + distance + '\'' + '}'; } }
使用此解决方案的说明:
Response response = new Response(jsonObject);
使用Retrofit2时的使用说明。 首先,我们需要创建自定义工厂,创建名为ResponseRetrofitConverter的类,以及以下代码:
import android.support.annotation.NonNull; import org.json.JSONObject; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import okhttp3.ResponseBody; import retrofit2.Converter; import retrofit2.Retrofit; public class ResponseRetrofitConverter extends Converter.Factory { public static ResponseRetrofitConverter create() { return new ResponseRetrofitConverter(); } @Override public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return new JsonConverter(); } private final static class JsonConverter implements Converter { @Override public Response convert(@NonNull ResponseBody responseBody) { try { return new Response(new JSONObject(responseBody.string())); } catch (Exception e) { return null; } } } }
当Response是您的实体时,使用以下代码行添加连接工厂以改进使用:
.addConverterFactory(ResponseRetrofitConverter.create())
例如我的代码:
Retrofit.Builder() .baseUrl(link) .addConverterFactory(ResponseRetrofitConverter.create()) .addConverterFactory(GsonConverterFactory.create()) .build();
您应该创建一个java对象List
来表示数据。
如果要绑定一个具有数字作为名称的Json,并且如果您使用jackson作为json库,则可以将变量声明如下:
@JsonProperty("0") private CustomObject zero; @JsonProperty("1") private CustomObject one; public CustomObject getZero() { return this.zero; } public void setZero(CustomObject zero) { this.zero= zero; } public CustomObject getOne() { return this.one; } public void setOne(CustomObject one) { this.one= one; }
如果您正在使用Gson,那么您可以使用如下:
public class Model{ @SerializedName("0") private String object; }
你可以叫你上课_0
, _1
……即使它有点奇怪。
- 使用Urban Airship从Java服务器向Android发送推送通知
- 如何使用共享首选项保存数据?
- NPE同时在老Androids上充气ActionBarSherlock
- 如何在nativescript中使用本机android小部件类型定义?
- Eclipse java断点 – 目的是什么?
- Android:将资产中的tar文件复制到sdcard – IOException
- 将数据插入SQLite数据库,数据类型不匹配
- java.lang.IllegalArgumentException:at android.view.Surface.unlockCanvasAndPost(Native Method)
- Google Maps API V2崩溃 – 致命exception