2016-10-14 3 views
0

У меня возникла проблема, я хочу использовать запрос GET с волейболом, а затем создать объект из возвращаемого JSON. Я заставляю его работать внутри прослушивателя onclick, но я не знаю, как заставить конструктор ответить.Создать объект из JSON (Volley Request) Java

Это мой медиа-класс, который получит URL из открытой базы данных фильма

public class Media extends MainActivity{ 
private String title; 
private String yearReleased; 
private String rated; 
private String director; 
private String actors; 
private String plot; 
private String posterUrl; 
private String type; 
final String TAG = AppController.class.getSimpleName(); 


public Media(String title, String yearReleased, String rated, String director, String actors, String plot, String posterUrl, String type) { 


    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.d(TAG, response.toString()); 
        try { 
         title = 
         rated = response.getString("Year"); 
         //String rated = response.getString("Rated"); 
         //String released = response.getString("Released"); 
         //String genre = response.getString("Genre"); 
         //String director = response.getString("Director"); 
         //String actors = response.getString("Actors"); 
         //String plot = response.getString("Plot"); 
         //String language = response.getString("Language"); 
         //String awards = response.getString("Awards"); 
         //String poster = response.getString("Title"); 
         //String imdbRating = response.getString("imdbRating"); 
         //String type = response.getString("Type"); 




        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), 
           "Error: " + e.getMessage(), 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        Toast.makeText(getApplicationContext(), 
          error.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      } 

    ); 
    AppController.getInstance().addToRequestQueue(jsonObjectRequest); 



    this.title = title; 
    this.yearReleased = yearReleased; 
    this.rated = rated; 
    this.director = director; 
    this.actors = actors; 
    this.plot = plot; 
    this.posterUrl = posterUrl; 
    this.type = type; 
} 

public Media(View.OnClickListener mainActivity) { 
    super(); 
} 

public void getJsonObject() { 

} 

//@Override 
//public String getTitle() {return title;} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getYearReleased() { 
    return yearReleased; 
} 

public void setYearReleased(String yearReleased) { 
    this.yearReleased = yearReleased; 
} 

public String getRated() { 
    return rated; 
} 

public void setRated(String rated) { 
    this.rated = rated; 
} 

public String getDirector() { 
    return director; 
} 

public void setDirector(String director) { 
    this.director = director; 
} 

public String getActors() { 
    return actors; 
} 

public void setActors(String actors) { 
    this.actors = actors; 
} 

public String getPlot() { 
    return plot; 
} 

public void setPlot(String plot) { 
    this.plot = plot; 
} 

public String getPosterUrl() { 
    return posterUrl; 
} 

public void setPosterUrl(String posterUrl) { 
    this.posterUrl = posterUrl; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

}

Другой вопрос, является ли это хорошая реализация? Или есть способ, который быстрее и лучше?

ответ

0

Лучший способ - использовать Gson. Gson автоматически анализирует JSON на POJO и наоборот.

Infact с помощью специального запроса вы можете фактически заставить volley вернуть POJO (объект Java) вместо JSON.

This article дает очень хорошее пошаговое объяснение этому

0

Что вам нужно сделать, это создать пустой конструктор, а в обратном вызове Response установить то, что вы получили в JSON, в атрибуты вашего класса.

Что-то вроде этого:

public Media() 
{ 
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.d(TAG, response.toString()); 
        try { 
         this.year = response.getString("Year"); 
         this.rated = response.getString("Rated"); 


         ... 


        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), 
           "Error: " + e.getMessage(), 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        Toast.makeText(getApplicationContext(), 
          error.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      } 

    ); 

    AppController.getInstance().addToRequestQueue(jsonObjectRequest); 
} 

EDIT: Но, иметь в виду, что это асинхронный, вы не будете иметь атрибуты установить до обратного вызова не выполняется. Если вы хотите сделать синхронный запрос, взгляните на this.

0

В качестве реализации я предпочел бы получить ответ JSONObject и десериализировать его непосредственно в объекте.

0
Create ModelClass for the fields and use Gson to make object of class from JSON response. 
Смежные вопросы