0

Retrofit での Json の解析に問題があります。私の URL: http://192.168.0.102:8000/api/get_services?keyword=someword

ここにある単語は、ユーザーがダイアログ ウィンドウに書き込む単語です。

私だけが必要です

  • 座標
  • 住所
  • 会社名

ここでは、座標に null があります。結果を取得して Google マップに表示したいと思います。

どうしたの?どうすれば問題を解決できますか?

JSON:

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;
    }
}
4

2 に答える 2

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]);
}
于 2015-05-03T00:01:05.160 に答える
0

positionresponse オブジェクトが正しくありません。そこに servicelist オブジェクトが必要です。jsonschema2pojo.org を使用してオブジェクトを生成し、再試行してください

于 2015-05-02T23:55:02.047 に答える