改造中

时间:2017-02-18 19:32:42

标签: android json gson retrofit2

我想像这样反序列化一个json:

{
"software": {
  "info": {
    "id": "1",
    "name": "نرم اقزار",
    "type": "complex"
  },

  "sub": {
    "windows": {
      "info": {
        "id": "2",
        "name": "ویندوزی",
        "type": "complex"
      },
      "sub": {
        "photoshop": {
          "info": {
            "id": "3",
            "name": "فوتوشاپ",
            "type": "product"
          }
        },
        "word": {...}
       ,
        "matlab": {...}
      }
    }
  },
  "ios": {...},
  "linux": {...}
}
}
}

Retrofit中执行此操作我编写了一些这样的模型:

Root.java

public class Root {

    public Software software;
}

Software.java

public class Software {

   public Info info;
   public Sub sub;
}

Info.java

public class info {

    public int id;
    public String name;
    public String type;
}

Sub.java

public class sub {

    public Software software;
}

假设所有getter和setter都在Classes中。

我的界面:

ServicesAPI.java

public interface ServicesAPI {

@GET("services.php")
Call<Root> getSofwares();

}

最后我的MainActivity是这样的:

 Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    ServicesAPI servicesAPI = retrofit.create(ServicesAPI.class);

    Call<Root> call = servicesAPI.getSofwares();
    call.enqueue(new Callback<Root>() {
        @Override
        public void onResponse(Call<Root> call, Response<Root> response) {
            //some codes
        }

        @Override
        public void onFailure(Call<Root> call, Throwable t) {
            //
        }
    });

当我构建此代码并运行它时,模型只获取第一级和第二级对象的数据。并且第三级中的对象始终给出null

this is the response

2 个答案:

答案 0 :(得分:0)

班级名称应以大写字母书写。

在你的案例中,它将是

public class Root {
   private Software software;
   private Sub sub; 
   private Ios ios;
   // .... and so on
}

由于名称是sub,但数据不同,您可以创建另一个模型,如

public class SubData { 
   SubInfo info; 

   class SubInfo {
      private int id;
      private String name;
      private String type;
   }
}

您的子类可能看起来像那样

 public class Sub {
    private Map<String, SubData> sub;
    private SubData windows; 
 }

你需要使用Map来让gson(de)为你序列化它。如果这些数据尚未知晓,您可能希望使用自定义反序列化器并验证&#34;键&#34;是JsonObject或String。

答案 1 :(得分:0)

给定的JSON看起来具有不一致的结构:$.software.sub.windows,但$.software.ios$.software.linux缺少中间sub属性。假设后两者必须直接嵌套到$.software.subwindows(与其所有后代结构类似),你只需要Sub类:它不能像你期望的那样多态。您获取null的原因只是路径$.software.sub.windows(以及ioslinux上的JSON)未正确映射:{{1期望您的JSON文档具有名为Software.sub的字段。您只需要像这样修改sub类:

Software

之后,您可以解析JSON并轻松遍历已解析的对象:

final class Software {

    Info info;
    Map<String, Software> sub; // previously `public Sub sub;`

}

输出:

  

فوتوشاپ