当前位置: 首页 > 知识库问答 >
问题:

reverfit2访问对象的内部数组

夏锐藻
2023-03-14

我试图从一个Json文件中提取一个对象列表,但是该文件以一个对象开始,该对象包含我需要的对象数组。我是一个新的改造这里是我的文件:接口

public interface OSMApi {

    @Headers({"Accept: application/json"})
    @GET("map")
    Call<List<OSMObject>> getOSMObjects(@Query("bbox") String boxMinMaxLatLon);
}

控制器

public class OSMController implements Callback<List<OSMObject>> {

    static final String BASE_URL = "https://api.openstreetmap.org/api/0.6/";
    private static final String TAG = "OSMController";

    private String bboxLatLon = "//latlongshere";

    public void start(){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    OSMApi osmApi = retrofit.create(OSMApi.class);

    Call<List<OSMObject>> call = osmApi.getOSMNodes(bboxLatLon);
    call.enqueue(this);
}

    @Override
    public void onResponse(Call<List<OSMObject>> call, Response<List<OSMObject>> response) {
        if(response.isSuccessful()){
            List<OSMObject> OSMObjectList = response.body();
            OSMObjectList.forEach(OSMObject -> Log.d(TAG, "onResponse: objects "+OSMObject.getId()));
        }else{
            Log.d(TAG, "onResponse: here : "+response.errorBody() + ", "+response.code());
        }
    }

    @Override
    public void onFailure(Call<List<OSMObject>> call, Throwable t) {
        Log.d(TAG, "onFailure: "+ t.getStackTrace() + ", extra: "+ t.getMessage());
    }
}

Json的开头

{
    "version": "0.6",
    "generator": "CGImap 0.8.3 (652902 spike-07.openstreetmap.org)",
    "copyright": "OpenStreetMap and contributors",
    "attribution": "http://www.openstreetmap.org/copyright",
    "license": "http://opendatacommons.org/licenses/odbl/1-0/",
    "bounds": {
        "minlat": 1.0,
        "minlon": 1.0,
        "maxlat": 1.0,
        "maxlon": 1.0
    },
    "elements": [
        {
            "type": "node",
            "id": 443479273,
            "lat": 1.0,
            "lon": 1.0,
            "timestamp": "2011-04-11T18:06:02Z",
            "version": 3,
            "changeset": 4435725,
            "user": "BeerOfTheTrip",
            "uid": 440880
        },
        {
            "type": "node",
            "id": 443479278,
            "lat": 1.0,
            "lon": 1.0,
            "timestamp": "2011-04-11T18:06:01Z",
            "version": 2,
            "changeset": 4435725,
            "user": "BeerOfTheTrip",
            "uid": 440880
        },
        {
            "type": "node",
            "id": 443479281,
            "lat": 1.0,
            "lon": 1.0,
            "timestamp": "2011-04-11T18:06:01Z",
            "version": 2,
            "changeset": 4435725,
            "user": "BeerOfTheTrip",
            "uid": 440880
        },
etc..........

我的对象Pojo

public class OSMObject implements SerializedName {

    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("id")
    @Expose
    private int id;
    @SerializedName("lat")
    @Expose
    private double lat;
    @SerializedName("lon")
    @Expose
    private double lon;
    @SerializedName("timestamp")
    @Expose
    private String timestamp;
    @SerializedName("version")
    @Expose
    private int version;
    @SerializedName("changeset")
    @Expose
    private int changeset;
    @SerializedName("uid")
    @Expose
    private int uid;
    @SerializedName("nodes")
    @Expose
    private int[] nodes;

    //Separation
    private ArrayList<OSMNode> OSMNodes = new ArrayList<>();
    private ArrayList<OSMWay> OSMWays = new ArrayList<>();

    public OSMObject(String type, int id, String timestamp, int version, int changeset, int uid, int[] nodes) {
        this.type = type;
        this.id = id;
        this.timestamp = timestamp;
        this.version = version;
        this.changeset = changeset;
        this.uid = uid;
        this.nodes = nodes;
    }

    public OSMObject(String type, int id, double lat, double lon, String timestamp, int version, int changeset, int uid) {
        this.type = type;
        this.id = id;
        this.lat = lat;
        this.lon = lon;
        this.timestamp = timestamp;
        this.version = version;
        this.changeset = changeset;
        this.uid = uid;
    }

+getters and setters....

所以我不需要jsonObject中的任何初始信息,我所需要的只是元素jsonArray中的对象列表,它由两个稍微不同的对象组成,一个有nodes[],一个没有。因此POJO中有2个构造函数?

我如何设置改装来处理这件事?与当前一样,我在失败时得到的错误是:

onFailure:[Ljava.lang.StackTraceElement;@DBE860F,Extra:应为BEGIN_ARRAY,但在第1行第2列路径$处为BEGIN_OBJECT

附加:两个不同对象的示例:

        {
            "type": "node",
            "id": 4448646916,
            "lat": 1.0,
            "lon": 1.0,
            "timestamp": "2020-12-21T17:52:35Z",
            "version": 1,
            "changeset": 44211151,
            "user": "Mike Greenwood",
            "uid": 44623152
        },
        {
            "type": "way",
            "id": 44117969,
            "timestamp": "2014-04-11T14:01:16Z",
            "version": 2,
            "changeset": 44627679,
            "user": "Smurfy12",
            "uid": 44220096,
            "nodes": [
                4483345702,
                443479293,
                443479273
            ],
            "tags": {
                "highway": "residential",
                "name": "A Street"
            }
        },

正如您所看到的,它们是不同的“类型”一个“节点”和一个“方式”方式有一个节点数组,而节点有一个“lat”和“lon”我现在不需要担心“标签”。

共有1个答案

强烨
2023-03-14

在“onresponse”中,尝试以下操作:

    if (response.isSuccessful()) {

        JSONObject reader = new JSONObject(response.body());

        List<OSMObject> OSMObjectList = (List<OSMObject>) reader.getJSONArray("elements");

        // now you can work on your "elements" list..

    } else {
        Log.d(TAG, "onResponse: here : " + response.errorBody() + ", " + response.code());
    }

注意:关于两个构造函数--我不确定你如何区分你需要使用哪一个构造函数的区别,因为在你的“元素”数组中只有3个相似的对象,所以如果你需要帮助--请解释一下区别是什么,或者给出你可能在那个数组中收到的另一个对象的例子。

 类似资料:
  • 因此,我正在构建一种基于对象的模型方法,并试图将所有现有的jQuery转换为纯JavaScript调用,但我遇到了一些问题。 所以我有一个基本的基础: 由于某些原因,当使用jQuery调用时,它都运行得很好,但是当使用Document.QuerySelector调用JS替代项时,我会得到一个错误,如下所示: 谁能给我解释一下.find()调用和传统JS的主要区别是什么?

  • 问题内容: 首先看下面的JavaScript对象 我想将值设置为与相同,因此我将对象值放在前面,但它对我不起作用,我也使用过,但仍然失败。我的问题是如何访问对象内对象的属性。 一些用户沉迷于问“您想做什么或发送脚本等”,对于那些人来说,答案很简单:“我想访问对象内的对象属性”,上面提到了脚本。 任何帮助将不胜感激 :) 问题答案: 使用 对象文字 语法时,不能在初始化期间引用对象。创建对象后,需要

  • 在JFrame类中,我有一个JPasswordField对象,如下所示: 我尝试通过以下代码行访问其插入的内容(用户插入的密码): 问题是,当我打印该内容时,我得到以下输出:password:[C@D5C0F9,而不是插入的密码

  • 问题内容: 我有以下数组,当我做得到: 我试图按如下方式访问数组: 但这显示了我: 未定义0 注意: 我从 Facebook SDK 4 获得此数组,所以我不知道原始的数组结构。 作为示例,如何访问数组中的值? 问题答案: 要访问或您如何使用两个不同的运算符。 数组 要访问数组元素,您必须使用,或者您不会看到太多,但也可以使用is 。 声明数组和访问数组元素之间的区别 定义数组和访问数组元素是两件

  • 上面的代码在我的主方法中。被注释掉的行抛出错误“无法在类车辆中找到符号”。我正在从一个文件中读取并将信息放置到正确的对象数据字段中。数组是车辆数组。根据我的理解,车辆数组的一个元素可以是车辆或车辆的任何子类。Getters和setters方法可用于每个相应的类和子类,使用父类的Getters和setters。汽车是车辆的一个子类。当我刚刚创建car对象时,为什么不在尝试vehicle之前先尝试访问

  • 我正在使用mongoose将一个玩家推入mongoose中的玩家数组,当一个玩家加入游戏时。我收到以下错误: