当对象键为number时如何创建Java getter和setter
我无法创建Java getter和setter,因为我得到了对象键的数字(digit)。 我将向您展示我的API响应。如何在不更改API的情况下实现这一点当对象键为number时如何创建Java getter和setter,java,android,retrofit,Java,Android,Retrofit,我无法创建Java getter和setter,因为我得到了对象键的数字(digit)。 我将向您展示我的API响应。如何在不更改API的情况下实现这一点 {"api_status": true, "message": "", "data": { "0": { "id": "aaa", "name": "aaa", "address": "aaa", "category":
{"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"
},
}
}
您应该创建对象的java
列表来表示数据。是的,您可以。像这样使用SerializedName
注释:
@SerializedName("0")
private MyClass myObject;
其中,MyClass
将表示要返回的数据的POJO
我只想指出一个更好的解决方案是更改API(因为这个响应很奇怪),返回一个列表,而不是一个带有数字作为键的对象,但我可以看到您在问题中写道,无法更改它
如果要绑定一个以数字作为名称的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;
}
你可以称你的班级为\u0
,\u1
。。。甚至有点奇怪。使用下面的类,并将其与json数据和类作为模型传递给GSON库。您将得到您的模型,每个数据项都映射到hashtable,其中key是您的数字,我将其表示为字符串,通过迭代hashmap,您将得到keySet,它是json数据键中的所有键。对于每个键,您都可以获得itemData
class JsonStructure{
public boolean api_status;
public String message
HashMap<String,ItemsData> 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;
}
在API接口中定义yoyr请求方法
interface ApiInterface{
@GET("_test/placeInDistance/")
Call<JsonStructure> getResponseForApiCall();
}
<代码>接口ApiInterface{
@获取(“\u test/placeindance/”)
调用getResponseFapiCall();
}
现在将此方法称为改装调用结构:
Call<JsonStructure> call = mApi.getResponseForApiCall();
Response<JsonStructure> response = call.execute();
HashMap<String, ItemsData> map = response .data;
Set<String> s = map.keySet();
Iterator<String> 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
}
Call Call=mApi.getResponseForApiCall();
Response=call.execute();
如下解析此响应:
Call<JsonStructure> call = mApi.getResponseForApiCall();
Response<JsonStructure> response = call.execute();
HashMap<String, ItemsData> map = response .data;
Set<String> s = map.keySet();
Iterator<String> 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
}
HashMap=response.data;
Set s=map.keySet();
迭代器i=s.Iterator();
while(i.hasNext()){
字符串键=i.next();
ItemsData=map.get(键);
字符串id=data.id;
字符串名称=data.name;
字符串地址=data.address;
字符串类别=data.category;
字符串open24Hr=data.open\u 24\u小时;
字符串businessOpen=data.business\u open;
字符串关闭=data.business\u close;
字符串纬度=data.latitue;
等
}
如果您使用的是Gson,则可以按如下方式使用:
public class Model{
@SerializedName("0")
private String object;
}
如果您真的需要解析这个JSON。使用自定义解决方案。 例如,我的解决方案。 使用以下代码创建类响应:
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<Data> 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);
使用时的使用说明2。
首先,我们需要创建自定义工厂,创建名为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<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return new JsonConverter();
}
private final static class JsonConverter implements Converter<ResponseBody, Response> {
@Override
public Response convert(@NonNull ResponseBody responseBody) {
try {
return new Response(new JSONObject(responseBody.string()));
} catch (Exception e) {
return null;
}
}
}
}
例如,我的代码:
Retrofit.Builder()
.baseUrl(link)
.addConverterFactory(ResponseRetrofitConverter.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
这不是一个正确的json格式,它是正确的,但它很奇怪。
last
comma是错误的,可能只是一个示例范围的复制和粘贴哦,是的@ScaryWombat,没有注意到,我以为他指的是键“0”和“1”。这没有错,这只是非常规的。我想他使用的是GSON,因为它与改装是同步进行的。好的,是的,我没有注意到。我的解决方案相当于Jackson。但是使用@SerializedName(“0”)是@Uditha Amarasinghe的problemtoString方法的最佳方法,我添加该方法只是为了调试。如果你不需要的话,你可以把它取下来。谢谢你。。您能解释一下如何为改型API调用添加此解决方案吗?您使用的改型版本是什么@UdithaAmarasinghecom.squareup.Reformation 2:Reformation:2.1.0@VovaStelmashchukI编辑了我的答案,你能检查一下吗@UdithaAmarasingheWhy发布了一个与我的答案相同的答案,但没有增加任何价值。谢谢Ashif Ahamad,你能解释一下如何添加此解决方案以改进API调用吗?@AshifAhamad,谢谢回复。。我得到零分。请检查我的代码public void onResponse(Call-Call,Response-responseHome){(intx=0;x
@UdithaAmarasinghe获取空指针的位置能否请您向我显示日志。@UdithaAmarasinghe获取数据的方式不正确responseHome.body().data.get(“name”)这是错误的获取方式您有HashMap items=responseHome.body().data;现在用迭代器迭代这个hashMap对象项以获得实际值我添加了您的代码,但仍然得到了空值,请帮助我。这里是activityHashMap items=responseHome.body().data;对于(intx=0;x
这里是我的接口类@get(“method?”)调用位置(@Query(“distance”)字符串距离)代码>这里是我的API调用reformation=new reformation.Builder().client(apirestclient.getOkHttpClient(mContext)).baseUrl(“url”).addConverterFactory(GsonConverterFactory.create()).build()代码>