wake-up-neo.com

Wie kann Retrofit 2.0 geschachtelte JSON-Objekte analysieren?

Unser Team beschließt, Retrofit 2.0 zu verwenden, und ich untersuche zunächst diese Bibliothek. Wie im Titel angegeben, möchte ich einige geschachtelte JSON-Objekte über Retrofit 2.0 in unserer Android-App analysieren. 

Beispielsweise ist hier ein verschachteltes JSON-Objekt mit dem Format:

{
        "title": "Recent Uploads tagged Android",
        "link": "https://www.flickr.com/photos/tags/Android/",
        "description": "",
        "modified": "2015-10-05T05:30:01Z",
        "generator": "https://www.flickr.com/",
        "items": [
        {
            "title": ...
            "link": ...
            "media": {"m":"This is the value I want to get:)"}
            "description": ...
            "published": ...
            "author": ...
            "author_id": ...
            "tags": ...
        },
        {...},
        ...
        ]
}

Ich interessiere mich für die JSON-Objekte im items-Array. Ich stelle fest, dass einige Posts über das Parsen geschachtelter JSON-Objekte über Retrofit 1.X verfügt, aber die neuesten Retrofit 2.0-APIs haben sich stark verändert, was bei der Anpassung an die neuen APIs verwirrend ist.

Zwei mögliche Lösungen kommen mir in den Sinn:

  1. Schreiben Sie meine eigene JSON-Konverterfabrik, die Converter.Factory erweitert.
  2. Geben Sie die rohe Antwort in einem String-Typ zurück und analysieren Sie sie von mir. Nach meinen ersten Recherchen ist es jedoch nicht leicht, die rohe Antwort von Retrofit 2.0 zu erhalten. Retrofit 2.0 scheint darauf zu bestehen, die Antwort in etwas umzuwandeln, bevor sie an mich weitergeleitet wird, und Retrofit stellt keine eigene StringConverter zur Verfügung. (Ich könnte falsch sein ~)

Update: Wir können die rohe Antwort erhalten, indem Sie JSONElement als Pojo für die HTTP-API-Schnittstelle festlegen und den von Retrofit bereitgestellten GSONConverter als Konverter verwenden.

24
hackjutsu

Vorausgesetzt, Ihr komplettes JSON sieht so aus 

{
  "title": "Recent Uploads tagged Android",
  "link": "https://www.flickr.com/photos/tags/Android/",
  "description": "",
  "modified": "2015-10-05T05:30:01Z",
  "generator": "https://www.flickr.com/",
  "items": [
    {
      "member1": "memeber value",
      "member2": "member value"
    },
    {
      "member1": "memeber value",
      "member2": "member value"
    }
  ]
}

Also wären Pojo-Klassen

public class MainPojo {
    private String title; 
    private String description;
    private String link;
    private String generator;
    private String modified;
    private ArrayList<Items> items;

    // Getters setters
}

public class Items {
    private String member2;
    private String member1;

    // Getters setters
}

Hinweis: Dies ist eine ähnliche Lösung für Ihre JSON. Mitglieder von Items.Java können geändert werden, wenn JSON über andere Schlüssel verfügt.


Update für Pojo als neue JSON

public class Items {
    private String tags;
    private String author;
    private String title;
    private String description;
    private String link;
    private String author_id;
    private String published;
    private Media media;

    // Getters and Setters
}

public class Media {
    private String m;
    // Getters and Setters
}
28
Pankaj Kumar

Der folgende Code hilft beim Verschachteln von Json-Objekten und -Arrays

zum beispiel: json

{  
    "similar_product":[  
        {  .....
}
    ],
    "options":{  
        "Blouse Length":[  
            {  "value_id":"696556",
               }

zuerst müssen wir eine Modellklasse erstellen. Die Namen der Modellklassenelemente sind in json-Elementen gleich. Wir können @SerializedName("for exact json name") verwenden.

public class Product {

       public Options options;

    public void setOptions(Options options) {
        this.options = options;
    }

    public Options getOptions() {
        return options;
    }


    // length...

    public class Options
    {
        @SerializedName("Blouse Length")
        private ArrayList<BlouseLength> blouseLengths;


        public void setBlouseLengths(ArrayList<BlouseLength> blouseLengths) {
            this.blouseLengths = blouseLengths;
        }

        public ArrayList<BlouseLength> getBlouseLengths() {
            return blouseLengths;
        }
    }



    public class BlouseLength {
        String value_id;
        public void setValue_id(String value_id) {
            this.value_id = value_id;
        }



        public String getValue_id() {
            return value_id;
        }
    }

}

erstelle eine Schnittstelle zum Nachrüsten, um ein Json-Element in der URL zu erhalten

// don't need to put values of id in retrofit 

ex:: "/api-mobile_.php?method=getProductById&pid="

Übergeben Sie einfach den URL-Parameter in der Abfrage. Es wird automatisch die URL abgerufen 

zum Beispiel:

public interface Retrofit_Api {

    @FormUrlEncoded

    @GET("/api-mobile_.php?method=getProductById")
    Call<Product> responseproduct(@Query("pid") String pid);


}

In deiner Hauptklasse

     String pid=editid.getText().toString();


        final Retrofit adapter = new Retrofit.Builder()
                .baseUrl(Product_url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        //Creating an object of our api interface
        Retrofit_Api api = adapter.create(Retrofit_Api.class);


        Call<Product> call = api.responseproduct(pid);


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


               ArrayList<Product.BlouseLength> p= new ArrayList(response.body().getOptions().getBlouseLengths());

Editadapter editadapter=new Editadapter(MainActivity.this,p);

                recyclerView.setAdapter(editadapter);


            }

            @Override
            public void onFailure(Call<Product> call, Throwable t) {


                Log.d("Error", t.getMessage());
            }
        });



    }
6
lemuriyan

Verwenden Sie Gson Easy Parsing für Ihre Modelle https://github.com/google/gson

Meine Helfer-Methoden:

public String toJson(Object object) {
    return gson.toJson(object);
}

public <T> T fromJson(String json, Class<T> classOfT) {
    return gson.fromJson(json, classOfT);
}

public <T> T fromJson(JsonElement jsonElement, Class<T> classOfT) {
    return gson.fromJson(jsonElement, classOfT);
}
4
KP_G

Ich habe vergessen, die @SerializedName- und @Expose-Annotationen für innere Klassenobjekte hinzuzufügen und nach dem Hinzufügen dieser Annotationsprobleme das Problem gelöst. So was:

JSON:

{"Id": 1,}

und Klassenmitglied:

@SerializedName("Id")
@Expose
private int id;

hast du volley ausprobiert Ich ziehe es dem Retrofit vor, das ist jetzt ein google-Produkt. Ich habe ein funktionierendes Beispiel, und wenn Sie nichts dagegen haben, kann ich Ihnen zeigen, dass es Ihnen gelingt http://www.androidhive.info/2014/09/Android- Json-Parsing-Using-Volley/

0
Goodlife