当对象键为number时如何创建Java getter和setter

当对象键为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":

我无法创建Java getter和setter,因为我得到了对象键的数字(digit)。 我将向您展示我的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"
         },
   }
  }

您应该创建对象的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对象项以获得实际值我添加了您的代码,但仍然得到了空值,请帮助我。这里是activity
HashMap 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()