Парсинг JSON from URL

 
 
 
Сообщения:1
Коллеги, добрый день.
Столкнулся, как мне кажется со сложной вложенной структурой JSON-файла, где пытаюсь "парсить" определенную позицию в строке.
По-порядку:
Организую запрос: http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=Cher&api_key=6c8dc87e402c8f96b8369f927ca0c1be&format=json
Получаю в ответе файл (он по запросу формируется, смысла его сюда копировать нет).
Из этого файла, из позиции "name" пытаюсь вытянуть значение строки "text" (на примере значения "Cher"). Делаю все через retrofit.

Для этого формирую класс для исходных данных Artist.java:

public class Artist {

    private String name;
    private ArrayList<Image> images;

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public ArrayList<Image> getImage() {

        return images;
    }

    public void setImage(ArrayList<Image> images) {

        this.images = images;
    }

    String text, size;

    public Artist (String text, String size){

            this.text = text;
            this.size = size;
    }

    public String getText() {

        return text;
    }

    public String getSize() {

        return size;
    }

}



Формирую api запрос:
public interface MusicInterface {

    String LASTFMURL = "http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=Cher&api_key=6c8dc87e402c8f96b8369f927ca0c1be&format=json";


    @GET
    Call<List<Artist>> getArtist();

}


Потом все собираю в единое целое в MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
    }

    private void getArtist(){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(MusicInterface.LASTFMURL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

                MusicInterface api = retrofit.create(MusicInterface.class);
                Call<List<Artist>> call = api.getArtist();

                call.enqueue(new Callback<List<Artist>>() {
                    @Override
                    public void onResponse(Call<List<Artist>> call, Response<List<Artist>> response) {

                        Log.e("OnResponce", "OK");
                        if (response.isSuccessful()) {
                            List<Artist> ImagesArrayList = response.body();
                            if (ImagesArrayList !=null){
                                textView.setText("Все получилось!");

                            }
                        }
                        else Log.e("Response", "Not ok");
                        }
                    @Override
                    public void onFailure(Call<List<Artist>> call, Throwable t) {

                        Log.e("OnFailure", "Fail");
                    }
                });
    }


    public void StartBtn(View view) {
        getArtist();
    }
}


Тестовое значение по нажатию кнопки "" не выводит...

Лог по ошибкам:
2019-12-11 10:07:38.903 2442-2442/com.example.parse_ok E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.parse_ok, PID: 2442
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at android.view.View.performClick(View.java:5610) 
at android.view.View$PerformClick.run(View.java:22265) 
at android.os.Handler.handleCallback(Handler.java:751) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
Caused by: java.lang.IllegalArgumentException: Missing either @GET URL or @Url parameter.
for method MusicInterface.getArtist
at retrofit2.Utils.methodError(Utils.java:52)
at retrofit2.Utils.methodError(Utils.java:42)
at retrofit2.RequestFactory$Builder.build(RequestFactory.java:197)
at retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:67)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:26)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
at java.lang.reflect.Proxy.invoke(Proxy.java:813)
at $Proxy0.getArtist(Unknown Source)
at com.example.parse_ok.MainActivity.getArtist(MainActivity.java:43)
at com.example.parse_ok.MainActivity.StartBtn(MainActivity.java:69)
 
 
Сообщения:374
Попробуйте разбить "LASTFMURL" на 2 части: базовый url и часть, которая добавляется в аннотацию "Get", как в примере.
 
Модераторы:demon_zxBeowulf13thShogun
Сейчас эту тему просматривают:Нет