2016-07-31 6 views
0

я пытаюсь получить от URL простого объекта JSON (не массив, просто {} s), и я получаю две ошибки:Джексон + залп - TypeReference абстрактен

Error:(43, 81) error: TypeReference is abstract; cannot be instantiated 

Error:(36, 16) error: no suitable constructor found for JsonObjectRequest(String,<anonymous Listener<JSONObject>>,<anonymous ErrorListener>) 
constructor JsonObjectRequest.JsonObjectRequest(String,JSONObject,Listener<JSONObject>,ErrorListener) is not applicable (actual and formal argument lists differ in length) 
constructor JsonObjectRequest.JsonObjectRequest(int,String,JSONObject,Listener<JSONObject>,ErrorListener) is not applicable (actual and formal argument lists differ in length) 

это мой OnCreate код:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 

    String url = getResources().getString(R.string.json_url); 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(GetJsonObject(url)); 
} 

и это мой метод JSONObject:

@NonNull 
    private JsonObjectRequest GetJsonObject(String url) { 
     return new JsonObjectRequest(url, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        if (response.length() > 0) { 
         Details results = mapper.readValue(response.toString(), new TypeReference<Details>()); 
         String a = response.toString(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_internet), Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

Я не понимаю ошибок, особенно TypeReference один , так как у меня есть другой код (witn jsonarray), который, кажется, так же.

Заранее благодарен!

+0

Вы смесительной Джексон JSONObject и Android встроенный в JSONObject, это выглядит как –

+0

Второстепенные проблемы ... Это, как вы читаете объект Джексон JSON 'картографа .readValue (response, Details.class) ' –

+0

Спасибо за ответы! Я изменил значение readvalue, как вы говорите, и все jsonobjects - это те, что были встроены в android. – emboole

ответ

1

Проблема: У вас не хватает Method.GET и JSONObject jsonObject параметры на вашем JsonObjectRequest

Вот конструктор, обратите внимание на первый и третий параметры.

public JsonObjectRequest(int method, String url, JSONObject jsonRequest, 
     Listener<JSONObject> listener, ErrorListener errorListener) 

Кроме того, это один слишком

public JsonObjectRequest(String url, JSONObject jsonRequest, 
     Listener<JSONObject> listener, ErrorListener errorListener) 

Где бы вы пройти null к JSONObject, чтобы сделать его запрос GET.


Вы используете Волейбол немного назад; as-in, заставляя его вернуться к синхронному шаблону метода. Вам нужно учитывать обратные вызовы.

Возьмем, например, этот метод удаления. Параметрирование двух слушателей.

@NonNull 
private JsonObjectRequest GetJsonObject(String url, Response.Listener<JSONObject> onSuccess, Response.ErrorListener onError) { 
    return new JsonObjectRequest(url, null, onSuccess, onError); 
} 

Это в основном то же самое, что просто сделать запрос Volley самостоятельно.

Теперь, считая Details, на самом деле является объектом, а не списком, как вы утверждаете. Вы не используете TypeReference для этого при использовании Джексона.

Назад к Volley, альтернативный шаблон - не возвращать запрос, а вместо этого фактически запустить его, а затем вернуть обратный вызов туда, где вам нужны эти данные. Кроме того, вы превратили JSONObject обратно в String для Jackson, так что вместо этого вы можете использовать StringRequest.

public void getJSONObject(String url, Response.Listener<String> responseListener) { 

    // Just some never-changing error message. 
    final Response.ErrorListener errorListener = new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Error", error.toString()); 
       Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_internet), Toast.LENGTH_LONG).show(); 
      } 
     }); 
    }; 

    StringRequest req = new StringRequest(url, responseListener, errorListener); 
    addToRequestQueue(req); // TODO: Need to add to a RequestQueue 
} 

И называть это как так

public void foo(String url) { 
     final ObjectMapper mapper = // etc...    

     // Can declare various listeners to do different things with the String response from the URL 
     Response.Listener<String> responseListener = new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        if (response.length() > 0) { 
         Details result = mapper.readValue(response, Details.class); 
         // TODO: Do something with the object 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     // Execution returned above, when finished with request 
     getJsonObject(url, responseListener); 
} 
+0

спасибо за подробный ответ.Я изменил весь код, как вы предлагаете, я получил сообщение об ошибке (отображается мое сообщение Toast) – emboole

+0

Я внесла некоторые изменения: я вызываю метод foo на onCreate, а очередь запросов: StringRequest req = new StringRequest (url, responseListener, errorListener); RequestQueue requestQueue = Volley.newRequestQueue (this); requestQueue.add (req); – emboole

+0

Конечно. Я просто положил туда. Главное было его содержание. И разные люди используют RequestQueue по-разному, поэтому я добавил комментарий там. –

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