如何修复预期的字符串,但在带有改造的嵌套数组上是 BEGIN_OBJECT

Posted

技术标签:

【中文标题】如何修复预期的字符串,但在带有改造的嵌套数组上是 BEGIN_OBJECT【英文标题】:how to fix Expected a string but was BEGIN_OBJECT on a nested array with retrofit 【发布时间】:2019-08-13 20:42:25 【问题描述】:

大家好,我遇到了 Expected a string 但 BEGIN_OBJECT 的问题 我现在浏览了 2 天找不到解决方案,需要帮助来解决这个问题,谢谢

我将 json 内容存储在数据库中,但在我的 json 上,我有一个嵌套数组,

这是我的 json 文件中的 1 项

[
    
    "id": "355",
    "indicaciones": "text",
    "efectos_secundarios": "text",
    "contraindicaciones": "",
    "precauciones_advertencias": "text",
    "interacciones": "",
    "nombre_principio_activo": "Decoquinato",
    "especies": [
                
                 "especies_id": "1"
                ,
                
                 "especies_id": "2"
                ,
                
                 "especies_id": "3"
                ,
                
                 "especies_id": "4"
                ,
                
                 "especies_id": "9"
                
               ]
    
]

这是我的带有构造函数、getter 和 seters 的模型

    private int id;
    private String indicaciones;
    private String dosis_via_administracion;
    private String efectos_secundarios;
    private String contraindicaciones;
    private String precauciones_advertencias;
    private String nombre_principio_activo;
    private String especies;

我的 api

   @GET("formulario.txt")
    Call<List<FormularioModel>> getFormularios();

这是我的改造,我失去了理智

    //store formilarion on database
    public void storeFormulariosToDb()
        Retrofit retrofitCat = new Retrofit.Builder()
                .baseUrl(ApiForm.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        ApiForm apicat = retrofitCat.create(ApiForm.class);
        Call<List<FormularioModel>> callCat = apicat.getFormularios();
        callCat.enqueue(new Callback<List<FormularioModel>>() 
            @Override
            public void onResponse(Call<List<FormularioModel>> callCat, Response<List<FormularioModel>> response) 
                List<FormularioModel> obtenercate =db.getALLFormulario();
                List<FormularioModel> cat = response.body();
                if(obtenercate.size() < cat.size())
                    for(int i = 0; i < cat.size(); i++)
                        FormularioModel cat1 = new FormularioModel(
                                cat.get(i).getId(),
                                cat.get(i).getIndicaciones(),
                                cat.get(i).getDosis_via_administracion(),
                                cat.get(i).getEfectos_secundarios(),
                                cat.get(i).getContraindicaciones(),
                                cat.get(i).getPrecauciones_advertencias(),
                                cat.get(i).getNombre_principio_activo(),
                                cat.get(i).getEspecies());  // Here is my problem


                        db.createFormularios(cat1);
                    

                

            

            @Override
            public void onFailure(Call<List<FormularioModel>> callCat, Throwable t) 
                Log.e("obtener formulario", t.getMessage());            
        );
    

这是我的 DBHelper 存储到 db

 public long createFormularios(FormularioModel itemFORM)
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues valores = new ContentValues();
        valores.put(FORMULARIO_ID, itemFORM.getId());
        valores.put(FORMULARIO_INDICA, itemFORM.getIndicaciones());
        valores.put(FORMULARIO_VIA, itemFORM.getDosis_via_administracion());
        valores.put(FORMULARIO_EFECT, itemFORM.getEfectos_secundarios());
        valores.put(FORMULARIO_CONTRA, itemFORM.getContraindicaciones());
        valores.put(FORMULARIO_PRECA, itemFORM.getPrecauciones_advertencias());
        valores.put(FORMULARIO_NOMBRE, itemFORM.getNombre_principio_activo());
        valores.put(FORMULARIO_ESPECIE, itemFORM.getEspecies());


        long formulario_id = db.insert(TABLE_FORMULARIOS, null, valores);

        return formulario_id;

    

为了阅读我的数据库

 public List<FormularioModel> getALLFormulario()
        List<FormularioModel> forms = new ArrayList<>();
        String selectQuery = " SELECT * FROM "
                + TABLE_FORMULARIOS
                + " ORDER BY "
                + FORMULARIO_NOMBRE + " ASC";

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.rawQuery(selectQuery,null);

        if(c.moveToFirst())
            do
                FormularioModel t = new FormularioModel();
                t.setId(c.getInt(c.getColumnIndex(FORMULARIO_ID)));
                t.setIndicaciones(c.getString(c.getColumnIndex(FORMULARIO_INDICA)));
                t.setDosis_via_administracion(c.getString(c.getColumnIndex(FORMULARIO_VIA)));
                t.setEfectos_secundarios(c.getString(c.getColumnIndex(FORMULARIO_EFECT)));
                t.setContraindicaciones(c.getString(c.getColumnIndex(FORMULARIO_CONTRA)));
                t.setPrecauciones_advertencias(c.getString(c.getColumnIndex(FORMULARIO_PRECA)));
                t.setNombre_principio_activo(c.getString(c.getColumnIndex(FORMULARIO_NOMBRE)));
                t.setEspecies(c.getString(c.getColumnIndex(FORMULARIO_ESPECIE)));
                forms.add(t);
             while (c.moveToNext());
        
        return forms;
    

我想将 especies 数组保存为字符串,以便能够在我的活动中显示它, 感谢您的帮助

【问题讨论】:

Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAY的可能重复 【参考方案1】:

问题在于您的modelespecies 不是objectslist 的字符串

在您的模型中将 private String especies; 更改为 private List&lt;Especies&gt; especies; 并创建一个名为 Especies 的类,如下所示

public class Especies 
    private String especies_id;
    ...

【讨论】:

以上是关于如何修复预期的字符串,但在带有改造的嵌套数组上是 BEGIN_OBJECT的主要内容,如果未能解决你的问题,请参考以下文章

如何修复预期值:“1”接收到的数组:[“COUNT (*)”:“1”] 在带有 jest 框架的 TypeORM 中出现错误

如何修复预期值:“1”收到的数组:带有jest框架的TypeORM中的[{“COUNT(*)”:“1”}]错误

如何通过改造将数组嵌套对象 Json 解析为 Kotlin?

预期 BEGIN_OBJECT 但在第 1 行第 1 列路径为 STRING - Laravel 到改造 2

如何解析具有相同键的不同数据类型的改造对象的json数组

预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2