Pobieranie z JSON-a do osobnych list i przekazanie do adaptera

Odpowiedz Nowy wątek
2018-10-07 19:35

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

Cześć ! Mam pytanie. Jak pobrać dane z mojego JSON-a do 2 list ( jedna pobiera tylko "Nazwy" a druga tylko "Ceny" )

Mój JSON:

[{
    "Nazwa": "Rower",
    "Cena": "300"
}, {
    "Nazwa": "Rower mtb",
    "Cena": "350"
}, {
    "Nazwa": "Piłka",
    "Cena": "50.7"
}]

Potrzebuje przekazać te listy do adaptera RecyclerView.

To wygenerowała mi strona http://www.jsonschema2pojo.org/

package bjd.adrian.recyclerviewandjson;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class FromSerachJSON {

@SerializedName("Nazwa")
@Expose
private String nazwa;
@SerializedName("Cena")
@Expose
private String cena;

// gettery i settery
}

Po wpisaniu

String s = fromSerachJSON.getNazwa;

występuje ten błąd:

10-07 20:08:12.149 6565-6565/bjd.adrian.recyclerviewandjson E/AndroidRuntime: FATAL EXCEPTION: main
    Process: bjd.adrian.recyclerviewandjson, PID: 6565
    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at com.google.gson.Gson.fromJson(Gson.java:927)
        at com.google.gson.Gson.fromJson(Gson.java:892)
        at com.google.gson.Gson.fromJson(Gson.java:841)
        at com.google.gson.Gson.fromJson(Gson.java:813)
        at bjd.adrian.recyclerviewandjson.MainActivity$1.onResponse(MainActivity.java:51)
        at bjd.adrian.recyclerviewandjson.MainActivity$1.onResponse(MainActivity.java:43)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:78)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
        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:6682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        at com.google.gson.Gson.fromJson(Gson.java:927) 
        at com.google.gson.Gson.fromJson(Gson.java:892) 
        at com.google.gson.Gson.fromJson(Gson.java:841) 
        at com.google.gson.Gson.fromJson(Gson.java:813) 
        at bjd.adrian.recyclerviewandjson.MainActivity$1.onResponse(MainActivity.java:51) 
        at bjd.adrian.recyclerviewandjson.MainActivity$1.onResponse(MainActivity.java:43) 
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:78) 
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106) 
        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:6682) 
        at java.lang.reflect.Method.invoke(Native Method) 

Szukałem w internecie jak to zrobić ale nic nie działa :-(

edytowany 3x, ostatnio: Adrian098741, 2018-10-07 20:10

Pozostało 580 znaków

2018-10-07 19:59

Rejestracja: 2 lata temu

Ostatnio: 2 godziny temu

0

Pokaż kod, w którym dostajesz tę odpowiedź z serwera, bo to co tutaj opisałeś nie ma prawa się kompilować.

Pozostało 580 znaków

2018-10-07 20:11

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

Przepraszam. To co pisało przed edycją było do innego JSON-a

Pozostało 580 znaków

2018-10-07 20:13

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

Przepraszam. To co pisało przed edycją było do innego JSON-a.
Przedtem była jeszcze jedna klasa z List<fromserachjson>

edytowany 1x, ostatnio: Adrian098741, 2018-10-07 20:13

Pozostało 580 znaków

2018-10-07 20:26

Rejestracja: 2 lata temu

Ostatnio: 2 godziny temu

0

Po pierwsze nie usuwaj informacji z postów, na które ktoś już odpowiedział, bo dyskusja traci sens i teraz mój poprzedni post jest bez sensu. Po drugie String s = fromSerachJSON.getNazwa; (zakładam, że brakuje nawiasów i masz getNazwa()) na pewno nie rzuca wyjątkiem, który wkleiłeś. Po trzecie już kiedyś pytałeś o ten problem tylko w drugą stronę - https://4programmers.net/Foru[...]ne/314222-jsonsyntaxexception.

Pozostało 580 znaków

2018-10-07 20:30

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

Ten kod wyrzuca powyższy błąd:

package bjd.adrian.recyclerviewandjson;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity
{

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

    public void serachAction(View view)
    {
        EditText editText = findViewById(R.id.editText);
        final String s = editText.getText().toString();

        String url = "https://shoppingcentreeshop.000webhostapp.com/androidAppScripts/szukajProduktu.php";

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                Log.v("Response ", + response);

                Gson gson = new Gson();

                FromSerachJSON fromSerachJSON = gson.fromJson(response, FromSerachJSON.class);

                String s = fromSerachJSON.getNazwa();

                Log.v("TAG = ", s);

            }
        }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("ERROR", error.toString());
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError
            {
                Map<String, String> params = new HashMap<String, String>();
                params.put("name_product", s);
                return params;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
        requestQueue.add(stringRequest);

        Intent intent = new Intent(MainActivity.this, RecyclerViewActivity.class);
        startActivity(intent);
    }
}

Wyrzuca go za każdym razem kiedy klikam przycisk

edytowany 2x, ostatnio: Adrian098741, 2018-10-07 20:31

Pozostało 580 znaków

2018-10-07 20:37

Rejestracja: 2 lata temu

Ostatnio: 2 godziny temu

1

No i nic dziwnego. Próbujesz GSON'em zserializować listę do jej pojedynczego elementu. Czyli dostajesz pewnie coś takiego.

[  
  {  
    "Nazwa":"Rower",
    "Cena":"300"
  },
  {  
    "Nazwa":"Rower mtb",
    "Cena":"350"
  },
  {  
    "Nazwa":"Piłka",
    "Cena":"50.7"
  }
]

A GSON'owi mówisz, że będzie tam na przykład coś takiego, więc rzuca Ci on wyjątkiem z dokładną informacją, co jest źle.

{  
  "Nazwa":"Rower",
  "Cena":"300"
}
edytowany 1x, ostatnio: Michał Sikora, 2018-10-07 20:38

Pozostało 580 znaków

2018-10-07 20:38

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

To co muszę zrobić, bo od 3 dni szukam rozwiązania i nic nie znalazłem

Pozostało 580 znaków

2018-10-07 20:47

Rejestracja: 2 lata temu

Ostatnio: 2 godziny temu

0

Nie wiem, zależy co chcesz osiągnąć.

Adrian098741 napisał(a):

Jak pobrać dane z mojego JSON-a do 2 list

Jeżeli to, co jest w cytacie powyżej, to takie mapowanie z tego JSON'a, który tutaj wkleiłeś nie jest trywialne. W ogóle nie rozumiem, czemu chcesz mieć dwie osobne listy. Nie możesz mieć jednej listy obiektów typu FromSerachJSON, który podałeś wcześniej? Pod tym linkiem w punkcie 6 masz przykład, jak deserializować listę GSON'em - https://www.baeldung.com/gson-deserialization-guide.

edytowany 1x, ostatnio: Michał Sikora, 2018-10-07 20:48

Pozostało 580 znaków

2018-10-07 21:06

Rejestracja: 2 lata temu

Ostatnio: 10 miesięcy temu

Lokalizacja: Tuchów

0

Mi chodzi tylko o to aby dane z JSON-a zostały wyświetlone w RecyclerView. Zawsze miałem 2 listy na 2 miejsca na tekst na 1 pasku.

P.S Android Studio koloruje mi na czerwono assertThat i instanceOf ( z linku co podałeś )

Pozostało 580 znaków

2018-10-07 21:14

Rejestracja: 2 lata temu

Ostatnio: 2 godziny temu

0
Adrian098741 napisał(a):

Mi chodzi tylko o to aby dane z JSON-a zostały wyświetlone w RecyclerView. Zawsze miałem 2 listy na 2 miejsca na tekst na 1 pasku.

Twój obecny problem nie ma nic wspólnego z RecyclerView. Najpierw musisz pobrać dane, co Ci nie wychodzi. Co do drugiej części zdania to nie rozumiem nawet co to znaczy.

Adrian098741 napisał(a):

P.S Android Studio koloruje mi na czerwono assertThat i instanceOf ( z linku co podałeś )

Przykład z linku zawiera test. Tobie test nie jest potrzebny. Bezmyślnie kopiowanie wszystkiego zazwyczaj nie ma sensu. Czytaj ze zrozumieniem i pisz swój kod na podstawie przykładów.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0