2015-05-02 2 views
0

У меня проблема с разбором Json в модификации. Мой URL: http://192.168.0.102:8000/api/get_services?keyword=somewordКак разобрать JSON с дооснащением

Ниже приведено слово, которое пользователь пишет в диалоговом окне.

мне нужен только

  • COORDS
  • адрес
  • company_name

Здесь я имею в нуле координат. Я хочу взять результаты и показать их Google Maps.

Что случилось? Как я могу исправить проблему?

JSON:

JSON Data Screenshot

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; 
    } 
} 
+0

вам нужно разместить Ваш объект positionresponse – dabluck

ответ

0

ваш объект positionresponse не является правильным. вам нужен объект servicelist. используйте jsonschema2pojo.org для генерации объектов и повторите попытку

+0

Может ий показать мне, как я могу это исправить? Я не понимаю вашу идею точно ... –

+0

возьмите выход json. перейдите в jschema2pojo.org (заполните все поля, как вы хотите). загрузите банку. экспортируйте классы и поместите их в свой проект. вам придется немного почистить, но как только они будут настроены должным образом, доработает только – dabluck

1

Как сказал вам dabluck, веб-служба отвечает JSONArray, поэтому вам нужно будет обернуть свой отзыв вокруг списка (например).

Что-то, как это должно работать:

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

Надеется, что это поможет.

EDIT: Для того, чтобы получить COORDS для каждого 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]); 
} 
+0

Привет, человек! У меня есть некоторые вопросы ... какое значение для позиции здесь. Я теперь уверен, что у меня есть это ... Не могли бы вы объяснить это, пожалуйста! –

+1

Извините, Нуржан, я сделал это так быстро, и мне не удалось создать конструктор. Теперь я исправил это. Чтобы сохранить ответ, который вы получаете, вам нужен Список с тем же именем переменной, что и JSON, в этом случае это «service_list». Теперь Gson создаст объект с ответом вашего JSON правильно. Надеюсь, что это поможет;) – SekthDroid

+0

Здравствуйте, человек снова! Спасибо за ваш ответ. Я немного запутался в своем документе LocationActivity.java, прежде чем мой обратный вызов был PositionResponse, в котором я описал координаты как значение коордов. Теперь, поскольку я понимаю, что Callback будет ListPositionResponse, и я не знаю, как взять из него координаты. Можете ли вы мне помочь еще раз, пожалуйста! –

Смежные вопросы