[英]Parsing Dynamic JSON node with retrofit gson
I'm using Woo-Commerce RestApi v2, using Retrofit
for api calling. 我正在使用Woo-Commerce RestApi v2,将
Retrofit
用于api调用。 when I'm fetching all category. 当我获取所有类别时。 There was a node name
image
, it returns blank array but when image uploaded it returns object. 有一个节点名
image
,它返回空白数组,但是当上载图像时,它返回对象。 Here is my JSON sample 这是我的JSON示例
[
{
"id": 15,
"name": "Albums",
"slug": "albums",
"parent": 11,
"description": "",
"display": "default",
"image": [],
"menu_order": 0,
"count": 4
},
{
"id": 9,
"name": "Clothing",
"slug": "clothing",
"parent": 0,
"description": "",
"display": "default",
"image": {
"id": 730,
"date_created": "2017-03-23T00:01:07",
"date_created_gmt": "2017-03-23T03:01:07",
"date_modified": "2017-03-23T00:01:07",
"date_modified_gmt": "2017-03-23T03:01:07",
"src": "https://example.com/wp-content/uploads/2017/03/T_2_front.jpg",
"title": "",
"alt": ""
},
"menu_order": 0,
"count": 36
}
]
The main problem with image node. 图像节点的主要问题。 How to create model class for that node.
如何为该节点创建模型类。 I used jsonschema2pojo.org for generate model class but that class only works, When I remove
image
from class. 我使用jsonschema2pojo.org生成模型类,但是当我从类中删除
image
时,该类才有效。 can you guide me what to do? 你能指导我怎么做吗? Any help would be appreciated.
任何帮助,将不胜感激。
ApiInterface apiService= ApiClient.getWooCommerceClient().create(ApiInterface.class);
Call<List<Category>> call=apiService.getAllCategories();
call.enqueue(new Callback<List<Category>>() {
@Override
public void onResponse(@NonNull Call<List<Category>> call, @NonNull Response<List<Category>> response) {
categoryList.addAll(response.body());
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(@NonNull Call<List<Category>> call, @NonNull Throwable t) {
}
});
You can do it by removing the @Expose
annotation and use Gson gson = new GsonBuilder().create();
您可以通过删除
@Expose
注释并使用Gson gson = new GsonBuilder().create();
at the Gson
constructor. 在
Gson
构造函数中。 The unfounded data will be set to null
. 毫无根据的数据将设置为
null
。
Try this . 尝试这个 。
Use Image
as String
使用
Image
作为String
Category 类别
public class Category {
/**
* id : 15
* name : Albums
* slug : albums
* parent : 11
* description :
* display : default
* image : []
* menu_order : 0
* count : 4
*/
private int id;
private String name;
private String slug;
private int parent;
private String description;
private String display;
private int menu_order;
private int count;
private String image;
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;
}
public String getSlug() {
return slug;
}
public void setSlug(String slug) {
this.slug = slug;
}
public int getParent() {
return parent;
}
public void setParent(int parent) {
this.parent = parent;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public int getMenu_order() {
return menu_order;
}
public void setMenu_order(int menu_order) {
this.menu_order = menu_order;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
Use in response 回应使用
@Override
public void onResponse(@NonNull Call<List<Category>> call, @NonNull Response<List<Category>> response) {
categoryList.addAll(response.body());
for (int i = 0; i < categoryList.size(); i++) {
if(!categoryList.get(i).getImage().contains("[")){
image = categoryList.get(i).getImage();
try {
JSONObject jsonObject = new JSONObject(image);
String imageUrl = jsonObject.getString("your_key");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
adapter.notifyDataSetChanged();
}
If it contains [
,you can't do any thing . 如果包含
[
,您将无法执行任何操作。
Else you can parse it in your code . 否则,您可以在代码中对其进行解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.