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

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 :-(

0

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

0

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

0

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

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ę - JsonSyntaxException.

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

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"
}
0

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

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.

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ś )

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.

0

Jeśli koniecznie chcesz mieć dwie listy (nie wiem po co), to chyba najprościej będzie pobrać do jednej i potem rozbić ją na dwie. W json masz tylko jedną listę, więc nie zmapujesz jen na dwie.

0

Już pobieranie do jednej działa. Tylko jak dodać aby na jednym TextView wyświetlała się nazwa A na drugim cena. Jak były 2 listy to wiedziałem jak A teraz jak jest 1 to nie wiem

0

Przecież Twój obiekt ma dwa pola. Wczytaj jedno pole do jednego TextView a drugie do drugiego...

0

No najlepiej tak, że w jednym text edit będzie wartość pola nazwa, a w drugim wartość pola cena

0

To jak to zrobić ? Kiedy próbuje pobrać coś z Listy to prosi mnie o indeks, a wtedy pobiera tylko 1 wartość i wyświetla tylko 1 wartość
Używając list.indexOf() ?

0

A jak byś rozwiązał ten problem?

// Wyciągnij wszystkie foo i wszystkie bar do odpowiednich list
void zadanie(List<MyClass> list) {
  List<String> foos = new ArrayList<>();
  List<String> bars = new ArrayList<>();
}

class MyClass {
  private final String foo;
  private final String bar;

  MyClass(String foo, String bar) {
    this.foo = foo;
    this.bar = bar;
  }

  String getFoo() {
    return foo;
  }

  String getBar() {
    return bar;
  }
}
0

Zrobiłem teraz takie coś holder.title.setText(fromSerachJSON.getNazwa());. Wtedy kiedy miałem listę to dodawałem do kodu na przykład to holder.title.setText(mTitles.get(position)); .
Czy bez tego .get(position) będzie działać tak samo ?
A jak nie to jak to napisać żeby było dobrze ?

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