改造2.3.0如何处理嵌套的json?

时间:2018-03-03 13:14:53

标签: java android retrofit

我对改造有点新意,我不知道如何处理这样的嵌套json结构。如果任何人可以帮助解析这种类型的结构。我真的很感激。我被困了好几天

{
"status": "ok",
"totalResults": 20,
"articles": [
{
"source": {
"id": null,
"name": "Bradenton.com"
},
"author": "By EILEEN NG  Associated Press",
"title": "Malaysia says search for missing plane to end in June",
"description": "An official says the search for Malaysia Airlines Flight 370 by a U.S. company will likely end in June, as families of passengers marked the fourth anniversary of the plane's disappearance with hope that the world's biggest aviation mystery will be solved.",
"url": "http://www.bradenton.com/news/business/article203286984.html",
"urlToImage": "http://www.mcclatchy-wires.com/incoming/ukogzw/picture203286949/alternates/LANDSCAPE_1140/Malaysia_Missing_Plane_57970.jpg",
"publishedAt": "2018-03-03T09:42:00Z"
}
]
}

5 个答案:

答案 0 :(得分:2)

http://www.jsonschema2pojo.org/将您的json转换为POJO并将其用于改造2.3

答案 1 :(得分:1)

创建一些pojos:

class Source {
   String id;
   String name;
}

class Article{
   Source source;
   String author;
   String title;
   String description;
   String url;
   String urlToImage;
   String publishedAt;
}

class GetArticlesResponse{
   String status;
   int totalResults;
   List<Article> articles;
}

然后将GetArticlesResponse传递给您的改装电话。

import retrofit2.Response;
import retrofit2.Call;
public interface YourInterface {
  @GET("your_end_point")
  Call<Response<GetArticlesResponse>> getArticles();
}

或者如果你正在使用RX:

import retrofit2.Response;
import rx.Observable;

public interface YourInterface {
  @GET("your_end_point")
  Observable<Response<GetArticlesResponse>> getArticles();
}

答案 2 :(得分:1)

如果您不知道需要制作多少课程,只需在此处复制并粘贴您的json click here

这将有助于您轻松完成工作。

答案 3 :(得分:0)

MainClass.java

public class MainClass {

@SerializedName("status")
@Expose
private String status;
@SerializedName("totalResults")
@Expose
private Integer totalResults;
@SerializedName("articles")
@Expose
private List<Article> articles = null;

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public Integer getTotalResults() {
return totalResults;
}

public void setTotalResults(Integer totalResults) {
this.totalResults = totalResults; 
}

public List<Article> getArticles() {
return articles;
}

public void setArticles(List<Article> articles) {
this.articles = articles;
}

}

Article.java

public class Article {

 @SerializedName("source")
 @Expose
 private Source source;
 @SerializedName("author")
 @Expose
 private String author;
 @SerializedName("title")
 @Expose
 private String title;
 @SerializedName("description")
 @Expose
 private String description;
 @SerializedName("url")
 @Expose
 private String url;
 @SerializedName("urlToImage")
 @Expose
 private String urlToImage;
 @SerializedName("publishedAt")
 @Expose
 private String publishedAt;

 public Source getSource() {
 return source;
 }

 public void setSource(Source source) {
 this.source = source;
 }

 public String getAuthor() {
 return author;
 }

 public void setAuthor(String author) {
 this.author = author;
 }

 public String getTitle() {
 return title;
 }

 public void setTitle(String title) {
 this.title = title;
 }

 public String getDescription() {
 return description;
 }

 public void setDescription(String description) {
 this.description = description;
 }

 public String getUrl() {
 return url;
 }

 public void setUrl(String url) {
 this.url = url;
 }

 public String getUrlToImage() {
 return urlToImage;
 }

 public void setUrlToImage(String urlToImage) {
 this.urlToImage = urlToImage;
 }

 public String getPublishedAt() {
 return publishedAt;
 }

 public void setPublishedAt(String publishedAt) {
 this.publishedAt = publishedAt;
 }

 }

Source.java

public class Source {

@SerializedName("id")
@Expose
private Object id;
@SerializedName("name")
@Expose
private String name;

public Object getId() {
return id;
}

public void setId(Object id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

改造界面

public interface YourInterface {
@GET("whatever api u are using")
Call<MainClass> getData(@Query("whatever key") String/int(whatever name)) //or leave blank
}

答案 4 :(得分:0)

当使用改造时,我建议使用Gson库将你的json解析为你应该创建的对象类型,所以首先应该从你得到的响应中创建一个表示对象的对象,这样它就会在你的情况下像这样的东西

public class Article implements Serializable {
private String author;
private String title;
private String description;
private String url;
private String urlToImage;
private String publishedAt;
private Source source;

public Story() {

}

public Story(String author,
             String title,
             Source source,
             String description,
             String url,
             String urlToImage,
             String publishedAt) {

    this.author = author;
    this.title = title;
    this.source = source;
    this.url = url;
    this.urlToImage = urlToImage;
    this.publishedAt = publishedAt;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public double getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getUrlToImage() {
    return urlToImage;
}

public void setUrlToImage(String urlToImage) {
    this.urlToImage = urlToImage;
}

public String getPublishedAt() {
    return publishedAt;
}

public void setPublishedAt(String publishedAt) {
    this.publishedAt = publishedAt;
}

public Source getSource() {
    return source;
}

public void setSource(Source source) {
    this.source = source;
}
}

并类似地创建另一个类,它是包含Source对象的Source类

public class Source implements Serializable {
   private id id;
   private String name;

   public Source() {

   }

   public Source(int id,
         String name) {

       this.id = id;
       this.name = name;
   }

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
 }

现在在你的改装api代码中,你可以做这样的事情

 @GET("YOUR_ENDPOINT/")
 Call<JsonObject> getArticles(... put your required fields here example ...@Query("token") String token);

并在你的活动中做这样的事情

List mArticleList = new ArrayList<>();
String mTotalResults = "";
UserApi service  =  ServiceGenerator.createService(UserApi.class);
Call<JsonObject> result = service.getArticles(token);

result.enqueue(new Callback<JsonObject>() {
     @Override
     public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
        if (response.code() == 200) {
           mArticleList = null;
           JsonArray data = response.body().getAsJsonObject("data").getAsJsonArray("articles");
           mArticleList = new Gson().fromJson(data.toString(), new TypeToken<List<Article>>(){}.getType());
           mTotalResults = response.body().getAsJsonObject("data").getAsString("totalResults");
//if you want it as an integer you could do something like 
           int totalResults = Integer.parseInt(mTotalResults);
           //... do what you want with your list
           //...
         }
    }
            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {
                //do what you have to do in case of error
            }
        });
    }

希望这会有所帮助