【问题标题】:How to parse JSON with Retrofit如何使用 Retrofit 解析 JSON
【发布时间】:2015-05-02 23:49:09
【问题描述】:

我在 Retrofit 中解析 Json 时遇到问题。 我的网址:http://192.168.0.102:8000/api/get_services?keyword=someword

这里的Someword是用户在对话窗口中写的单词。

我只需要

  • 坐标
  • 地址
  • 公司名称

这里我的坐标为空。我想获取结果并将其显示在 Google 地图上。

怎么了?如何解决问题?

JSON:

LocationActivity.java

private void showInputDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        final LayoutInflater inflater = this.getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.dialog_search, null);
        builder.setView(dialogView);

        final EditText inputSearch = (EditText) dialogView.findViewById(R.id.input_service);
        inputSearch.setInputType(InputType.TYPE_CLASS_TEXT);

        builder.setPositiveButton("Поиск", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                final String SearchPosition = inputSearch.getText().toString();

                if (SearchPosition.matches("")) { //Check if EditText is empty
                    Toast.makeText(getApplicationContext(), "Space is empty!", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    NetworkFactory.getInstance().getApiCall().getPosition(new Words(SearchPosition), new Callback<PositionResponse>() {
                        @Override
                        public void success(PositionResponse positionResponse, Response response) {
                            Log.d("Result: ", Arrays.toString(positionResponse.getPosition()).replaceAll("\\[|\\]", ""));
                            if (positionResponse.getPosition() == null) {
                                //Toast Message
                                Toast.makeText(getApplicationContext(), "There is no such result! Try again!", Toast.LENGTH_LONG).show();
                            } else {
                                String mLatLng = Arrays.toString(positionResponse.getPosition()).replaceAll("\\[|\\]", "");

                                String[] arrayLatLng = mLatLng.split(","); //separate out lat and lon
                                LatLng positionLatLon = new LatLng(Double.parseDouble(arrayLatLng[0]), Double.parseDouble(arrayLatLng[1])); //create the LatLng object

                                mGoogleMap.addMarker(new MarkerOptions().position(positionLatLon)
                                        .title("Result")
                                        .snippet("Result of search: " + SearchPosition)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_location)));

                                CameraPosition cameraPosition = new CameraPosition.Builder().target(positionLatLon).zoom(17).build();
                                mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                            }
                        }

                        @Override
                        public void failure(RetrofitError error) {
                            error.toString();
                        }
                    });
                }
            }
        });
        builder.show();
    }

NetworkFactory.java

public class NetworkFactory {
    public static final String API_URL = "http://192.168.0.102:8000";
    private static NetworkFactory ourInstance = new NetworkFactory();
    private ApiCalls apiCalls;

    private NetworkFactory() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(API_URL)
                .build();
        apiCalls = restAdapter.create(ApiCalls.class);
    }

    public static NetworkFactory getInstance() {
        return ourInstance;
    }

    public ApiCalls getApiCall() {
        return apiCalls;
    }
}

ApiCalls.java

    public interface ApiCalls {
        @GET("/api/get_services")
        void getPosition(@Query("keyword") Words words, Callback<PositionResponse> responseCallback);
    }

PositionResponse.java

public class PositionResponse {
    private double[] coords;
    private String address;
    private String company_name;

    public double[] getPosition() {
        return coords;
    }

    public void setPosition(double[] coords) {
        this.coords = coords;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCompanyName() {
        return company_name;
    }

    public void setCompanyName(String company_name) {
        this.company_name = company_name;
    }
}

【问题讨论】:

  • 你需要发布你的 positionresponse 对象

标签: java android json retrofit android-parser


【解决方案1】:

正如 dabluck 告诉您的,您的 Web 服务使用 JSONArray 响应,因此您需要将响应包装在 List 周围(例如)。

这样的事情应该可以工作:

public class ListPositionResponse { 

    private List<PositionResponse> service_list;
    public ListPositionResponse(List<PositionResponse> service_list){
        this.service_list = service_list;
    }
} 

所以你的改造电话将是:

public interface ApiCalls { 
        @GET("/api/get_services") 
        void getPosition(@Query("keyword") Words words, Callback<ListPositionResponse> responseCallback);
}

希望对你有帮助。

编辑:获取每个 PositionResponse 的坐标:

public class ListPositionResponse { 

        private List<PositionResponse> service_list;
        public ListPositionResponse(List<PositionResponse> service_list){
            this.service_list = service_list;
        }

        public List<PositionResponse> getPositions(){
            return this.service_list;
    } 



// And In your Activity
public void showCoords(ListPositionResponse positionResponse){
    for(PositionResponse position : positionResponse.getPositions()){
        doSomethingWithPosition(position);
    }
}


public void doSomethingWithPosition(PositionResponse position){
    double[] coords = position.getPosition();
    LatLng positionLatLon = new LatLng(double[0], double[1]);
}

【讨论】:

  • 你好!我有一些问题......这里的位置值是什么意思。我现在确定我拥有它...请您解释一下!
  • 对不起Nurzhan,我做得太快了,我创建构造函数失败。现在我已经修好了。为了能够保存您得到的响应,您需要一个与 JSON 具有相同变量名称的列表,在本例中为“service_list”。现在 Gson 将正确创建一个带有 JSON 响应的对象。希望它有所帮助;)
  • 你好!感谢您的回复。在我的回调是 PositionResponse 之前,我在 LocationActivity.java 文档中有点困惑,我在其中将坐标描述为坐标值。现在,据我所知,回调将是 ListPositionResponse,我不知道如何从中获取坐标。请你再帮我一次!
  • 您好 Nurzhan,我已经更新了回复,内容可能对您有所帮助
【解决方案2】:

您的 positionresponse 对象不正确。你需要一个服务列表对象。使用 jsonschema2pojo.org 生成对象并重试

【讨论】:

  • 获取 json 输出。将其放入 jschema2pojo.org(按照您的需要填写所有字段)。下载罐子。导出类并将它们放入您的项目中。你必须做一些清理工作,但是一旦它们被正确配置,改造就可以工作了
猜你喜欢
  • 2015-11-08
  • 2019-01-19
  • 2021-01-17
  • 2016-01-09
  • 1970-01-01
  • 2018-07-12
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多