【问题标题】:Retrofit cannot extract JSON in an objectRetrofit 无法在对象中提取 JSON
【发布时间】:2017-04-11 23:13:47
【问题描述】:

我正在研究如何使用 Retrofit 来停止使用AsyncTask。我有一个名为Network 的接口发出我的GET 请求,一个ServiceGenerator 类创建我的Retrofit.Builder 和我的HTTP 拦截器,最后是我的MainActivity(我还实现了名为Results 的对象类)。

问题是,在我MainActivity 中的onResponse 方法(.enqueue)中:我不知道如何提取JSON 并在视图中放置“名称”标签。

这是我的ServiceGenerator 课程:

public class ServiceGenerator {
    //URL base do endpoint. Deve sempre terminar com /
    public static final String API_BASE_URL = "https://randomuser.me/";

    public static <S> S createService(Class<S> serviceClass) {
        //Instancia do interceptador das requisições

        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
                .readTimeout(5, TimeUnit.SECONDS);

        httpClient.addInterceptor(loggingInterceptor);
        //httpClient.addInterceptor(loggingInterceptor).build();

        //Instância do retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .client(httpClient.build())
                .build();

        return retrofit.create(serviceClass);
    }
}

这是我的界面Network

public interface Network {

    @GET("api/")
    Call<Results> randomUser();

}

最后是主要活动:

public class MainActivity2 extends AppCompatActivity {

    private TextView nome;
    private TextView sobrenome;
    private TextView email;
    private TextView endereco;
    private TextView cidade;
    private TextView estado;
    private TextView username;
    private TextView senha;
    private TextView nascimento;
    private TextView telefone;
    private ImageView foto;
    private ProgressDialog load;
    public String gender;
    public Results results;
    public static final String BASE_URL = "https://randomuser.me/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nome = (TextView) findViewById(R.id.nome);
        sobrenome = (TextView) findViewById(R.id.sobrenome);
        email = (TextView) findViewById(R.id.email);
        endereco = (TextView) findViewById(R.id.endereco);
        cidade = (TextView) findViewById(R.id.cidade);
        estado = (TextView) findViewById(R.id.estado);
        username = (TextView) findViewById(R.id.username);
        senha = (TextView) findViewById(R.id.senha);
        nascimento = (TextView) findViewById(R.id.nascimento);
        telefone = (TextView) findViewById(R.id.telefone);
        foto = (ImageView) findViewById(R.id.foto);

        Network network = ServiceGenerator.createService(Network.class);

         Call<Results> requestUser = network.randomUser();

        requestUser.enqueue(new Callback<Results>() {
            @Override
            public void onResponse(Call<Results> call, Response<Results> response) {
                if (response.isSuccessful()) {

                    ProgressDialog progress = new ProgressDialog(MainActivity2.this);
                    progress.setTitle("sending...");
                    progress.show();
                    Results r = response.body();

                    /*MAYBE I SHOULD PUT SOMETHING HERE:*/

                    if (r != null) {

                        System.out.println();

                       // r.setGender(results.getGender());

                        nome.setText((CharSequence) results.setName(r.getName()));

                        //System.out.println("USER 2: " + response.raw() );

                        //r.setGender(r.getGender());
                        //Results r = new Results();

                        progress.dismiss();

                      //  nome.setText(results.gender.toString());

                        // System.out.println("random user: CARAIO  " + user.random);
                           //nome.setText((CharSequence) r.gender);

                    } else Toast.makeText(MainActivity2.this,"ERROR IN GET JSON",Toast.LENGTH_LONG).show();
                }

                }

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

            }
        });

    }
}

我的Results 类也是:

public class Results {

    public static String gender;

    public Results(){};

    public static String getGender() {
        return gender;
    }

    public static void setGender(String gender) {
        Results.gender = gender;
    }

    public List<Name> getName() {
        return name;
    }

    public Object setName(List<Name> name) {
        this.name = name;
        return null;
    }

    public List<Location> getLocation() {
        return location;
    }

    public void setLocation(List<Location> location) {
        this.location = location;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Login> getLogin() {
        return login;
    }

    public void setLogin(List<Login> login) {
        this.login = login;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public List<Picture> getPicture() {
        return picture;
    }

    public void setPicture(List<Picture> picture) {
        this.picture = picture;
    }

    public List<Name> name;
    public List<Location> location;
    public String email;
    public List<Login> login;
    public String phone;
    public List<Picture> picture;

}

如果能帮到你,不胜感激,谢谢。

【问题讨论】:

    标签: android json gson retrofit2


    【解决方案1】:

    您将需要这个: https://github.com/square/retrofit/tree/master/retrofit-converters/jackson 将其添加到 gradle 并同步。 在创建改造实例时,调用 builder

    .setConverter(new JacksonConverter())

    使用 jackson 进行 json 反序列化。 使用

    更新您的模型类

    @JsonProperty("put name of field here")

    那么一切都应该正常工作/

    【讨论】:

    • 你想和Jackson解决,我以前没用过,你觉得比GSon好吗? (更好的意思是“不那么复杂”的色调)。
    • 它非常易于使用,并且大多数情况下它比 gson 更快。它有很多功能和可选的东西,但对于大多数情况来说,了解基本知识就足够了。
    【解决方案2】:

    像这样更改您的网络接口

    public interface Network {
    
        @GET("api/")
        Call<RandomUserServiceResponse> randomUser();
    
    }
    

    在您的项目中添加此响应模型。它是您的 JSON 响应的基本响应

     public class RandomUserServiceResponse {
    
        private List<Result> results = null;
       // private Info info;
    
        public List<Result> getResults() {
            return results;
        }
    
        public void setResults(List<Result> results) {
            this.results = results;
        }
    
    }
    

    在你做完所有这些之后你的回应

     Call<RandomUserServiceResponse> requestUser = network.randomUser();
    
            requestUser.enqueue(new Callback<RandomUserServiceResponse>() {
                @Override
                public void onResponse(Call<RandomUserServiceResponse> call, Response<RandomUserServiceResponse> response) {
    
                    if (response.isSuccessful()) {
    
                        ProgressDialog progress = new ProgressDialog(MainActivity2.this);
                        progress.setTitle("sending...");
                        progress.show();
                        RandomUserServiceResponse r = response.body();
    
    
    
                    /* if you want to get NAME tag please */
                    Name name = r.getResults().getName();
                   /* now you can get Name properties 
                   name.getTitle(),name.getFirst(),name.getLast() */
    
    
    
    
                        if (r != null) {
    
                            System.out.println();
    
                           // r.setGender(results.getGender());
    
                            nome.setText((CharSequence) results.setName(r.getName()));
    
                            //System.out.println("USER 2: " + response.raw() );
    
    
                            //r.setGender(r.getGender());
                            //Results r = new Results();
    
    
    
                            progress.dismiss();
    
                          //  nome.setText(results.gender.toString());
    
    
                            // System.out.println("random user: CARAIO  " + user.random);
                               //nome.setText((CharSequence) r.gender);
    
    
                        } else Toast.makeText(MainActivity2.this,"ERROR IN GET JSON",Toast.LENGTH_LONG).show();
                    }
    
                    }
    
                @Override
                public void onFailure(Call<RandomUserServiceResponse> call, Throwable t) {
    
                }
            });
    

    这是你的结果类

    public class Result {
    
        private String gender;
        private Name name;
        private Location location;
        private String email;
        private Login login;
        private String dob;
        private String registered;
        private String phone;
        private String cell;
        private Id id;
        private Picture picture;
        private String nat;
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public Name getName() {
            return name;
        }
    
        public void setName(Name name) {
            this.name = name;
        }
    
        public Location getLocation() {
            return location;
        }
    
        public void setLocation(Location location) {
            this.location = location;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Login getLogin() {
            return login;
        }
    
        public void setLogin(Login login) {
            this.login = login;
        }
    
        public String getDob() {
            return dob;
        }
    
        public void setDob(String dob) {
            this.dob = dob;
        }
    
        public String getRegistered() {
            return registered;
        }
    
        public void setRegistered(String registered) {
            this.registered = registered;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getCell() {
            return cell;
        }
    
        public void setCell(String cell) {
            this.cell = cell;
        }
    
        public Id getId() {
            return id;
        }
    
        public void setId(Id id) {
            this.id = id;
        }
    
        public Picture getPicture() {
            return picture;
        }
    
        public void setPicture(Picture picture) {
            this.picture = picture;
        }
    
        public String getNat() {
            return nat;
        }
    
        public void setNat(String nat) {
            this.nat = nat;
        }
    
    }
    

    这是名称类

    public class Name {
    
        private String title;
        private String first;
        private String last;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getFirst() {
            return first;
        }
    
        public void setFirst(String first) {
            this.first = first;
        }
    
        public String getLast() {
            return last;
        }
    
        public void setLast(String last) {
            this.last = last;
        }
    
    }
    

    还有你的图片课

    public class Picture {
    
        private String large;
        private String medium;
        private String thumbnail;
    
        public String getLarge() {
            return large;
        }
    
        public void setLarge(String large) {
            this.large = large;
        }
    
        public String getMedium() {
            return medium;
        }
    
        public void setMedium(String medium) {
            this.medium = medium;
        }
    
        public String getThumbnail() {
            return thumbnail;
        }
    
        public void setThumbnail(String thumbnail) {
            this.thumbnail = thumbnail;
        }
    
    }
    

    这是你的登录类

    public class Login {
    
        private String username;
        private String password;
        private String salt;
        private String md5;
        private String sha1;
        private String sha256;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getSalt() {
            return salt;
        }
    
        public void setSalt(String salt) {
            this.salt = salt;
        }
    
        public String getMd5() {
            return md5;
        }
    
        public void setMd5(String md5) {
            this.md5 = md5;
        }
    
        public String getSha1() {
            return sha1;
        }
    
        public void setSha1(String sha1) {
            this.sha1 = sha1;
        }
    
        public String getSha256() {
            return sha256;
        }
    
        public void setSha256(String sha256) {
            this.sha256 = sha256;
        }
    
    }
    

    这里是位置类

    public class Location {
    
        private String street;
        private String city;
        private String state;
        private Integer postcode;
    
        public String getStreet() {
            return street;
        }
    
        public void setStreet(String street) {
            this.street = street;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        public Integer getPostcode() {
            return postcode;
        }
    
        public void setPostcode(Integer postcode) {
            this.postcode = postcode;
        }
    
    }
    

    这是你的 Info 类(你不需要导入这个)

    public class Info {
    
        private String seed;
        private Integer results;
        private Integer page;
        private String version;
    
        public String getSeed() {
            return seed;
        }
    
        public void setSeed(String seed) {
            this.seed = seed;
        }
    
        public Integer getResults() {
            return results;
        }
    
        public void setResults(Integer results) {
            this.results = results;
        }
    
        public Integer getPage() {
            return page;
        }
    
        public void setPage(Integer page) {
            this.page = page;
        }
    
        public String getVersion() {
            return version;
        }
    
        public void setVersion(String version) {
            this.version = version;
        }
    
    }
    

    最后一个是ID类

    public class Id {
    
        private String name;
        private Object value;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Object getValue() {
            return value;
        }
    
        public void setValue(Object value) {
            this.value = value;
        }
    
    }
    

    【讨论】:

    • 我试过你所说的@Umut,但现在它出现在我的 MainActivity onFailure 方法(enqueue)“+ java.lang.IllegalStateException:预期 BEGIN_ARRAY 但在第 1 行第 38 列路径 $ 的 BEGIN_OBJECT 上。 results[0].name "...看来我在我的对象类中实例化一个对象而不是一个数组,我应该将我的 Results 类更改为一个数组吗?我在改造教程中从未见过这种情况
    • @4ury0n 我用所有模型更新答案请从答案中获取新模型
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2021-10-02
    • 2017-08-08
    • 1970-01-01
    • 2022-01-21
    • 2014-01-04
    • 2019-12-14
    相关资源
    最近更新 更多