Ожидался BEGIN_OBJECT, но был BEGIN_ARRAY на пути Moshi Json Data Exception

Я использую Moshi в качестве преобразователя для модернизации, но для одного конкретного запроса он не работает и выдается исключение:

com.squareup.moshi.JsonDataException: ожидалось BEGIN_OBJECT, но было BEGIN_ARRAY по пути $ .animaux

Вот Json

    "nb_animaux": 1,
    "animaux": [
        {
            "code_iso": "768010103010004",
            "photos": [],
            "espece": {
                "id": 1,
                "fr": "Bovin",
                "en": "Bovine"
            },
            "elevage": {
                "parametre_geographique": {
                    "prefecture": "Oti",
                    "region": "Savane",
                    "commune": "Mango",
                    "pays": {
                        "fr": "TOGO",
                        "en": "TOGO"
                    },
                    "village": "Fonboro"
                },
                "type_elevage": {},
                "code_elevage": "76801010301"
            },
            "sexe": "m",
            "date_naissance": 1561932000,
            "category": {
                "fr": "Taureau",
                "en": "Bull"
            },
            "proprietaire": {
                "id": 10,
                "fullname": "edem",
                "adresse": "lome",
                "telephone": "98665478"
            }
        }
    ],
    "num_transport": "1/11/2019/TG",
    "date_transport": 1574784132,
    "traite": false
}

Мой модельный класс

@Entity
data class Animal(
    @field:PrimaryKey
    var id: Long,
    @ColumnInfo(name = "nb_animaux")
    @Json(name = "nb_animaux")
    var nbAnimaux : Int,
    @Embedded
    @get:Json(name = "animaux")
    var animaux : Animaux,
    @ColumnInfo(name = "num_transport")
    @Json(name = "num_transport")
    var numeroTransport : String,
    @ColumnInfo(name = "date_transport")
    @Json(name = "date_transport")
    var dateTransport : Long,
    var traite: Boolean

)
@JsonClass(generateAdapter = true)
data class Animaux(
    @ColumnInfo(name = "animaux_id")
    var id : Long,
    @ColumnInfo(name = "code_iso")
    @Json(name = "code_iso")
    var codeIso : Long,
    @Embedded
    var espece : Espece,
    @Embedded
    var elevage : Elevage,
    var sexe : String,
    @ColumnInfo(name = "date_naisance")
    @Json(name = "date_naisance")
    var dateNaissance : Long,
    @ColumnInfo(name = "race_pere")
    @Json(name = "race_pere")
    var racePere: String,
    @ColumnInfo(name = "race_mere")
    @Json(name = "race_mere")
    var raceMere: String,
    @Embedded
    var category: Category,
    @Embedded
    var proprietaire: Proprietaire

)
/*{
    constructor() : this(0, 0, Espece(0,"",""), Elevage(0, ParametreGeographique("","","",
        Country("",""),""
    ),0), "", 0, "", "", Category(0,"",""),Proprietaire
    (0,"","","",""))
}
 */
data class Espece(
    @ColumnInfo(name = "id_espece")
    @Json(name = "id_espece")
    var id: Long,
    var fr : String,
    var en : String
)
data class Elevage(
    @ColumnInfo(name = "id_elevage")
    @Json(name = "id_elevage")
    var id: Long,
    @Embedded
    var parametregeographique: ParametreGeographique,
    @ColumnInfo(name = "code_elevage")
    @Json(name = "code_elevage")
    var codeElevage : Long
)
data class ParametreGeographique(
    var prefecture : String,
    var region : String,
    var commune : String,
    @Embedded
    var pays : Country,
    var village : String
)
data class Country(
    @ColumnInfo(name = "fr_pays")
    @Json(name = "fr_pays")
    var fr : String,
    @ColumnInfo(name = "en_pays")
    @Json(name = "en_pays")
    var en : String
)

data class Category (
    @ColumnInfo(name = "id_category")
    var id: Long,
    @ColumnInfo(name = "fr_category")
    var fr : String,
    @ColumnInfo(name = "en_category")
    var en : String
)
data class Proprietaire(
    @ColumnInfo(name = "id_proprietaire")
    var id: Long,
    var fullname : String,
    var telephone : String,
    @ColumnInfo(name = "telephone_second")
    var telephoneSecond : String,
    @ColumnInfo(name = "photo_profile")
    var photoProfil : String
)

Призыв к модернизации

@GET("marche-betail/transport/{id}")
fun commandesDetailFromServer(@Path("id") id: Long?): Observable<Animal>

Как мне справиться с ошибкой. Я попытался использовать конструктор для класса Animaux, но получаю ошибку. Я также использовал list<Animaux>, но это не сработало.


person nimondo    schedule 27.11.2019    source источник
comment
Я использовал также список, но это не сработало. Вы имеете в виду var animaux: List<Animaux> вместо Animaux? Похоже, это должно сработать для меня, а если нет, это другая ошибка.   -  person Alexey Romanov    schedule 28.11.2019
comment
Как вы реализуете это в классе модели. Не могли бы вы показать, как это сделать, потому что при попытке я получаю эту ошибку error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List   -  person nimondo    schedule 28.11.2019


Ответы (1)


В вашем JSON есть список Animaux, а не только один. Значит, вам нужен var animaux: List[Animaux], а не только Animaux.

Как вы реализуете это в классе модели. Не могли бы вы показать, как это сделать, потому что при попытке я получаю эту ошибку: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List

Комната не поддерживает такие поля напрямую. Технически вы можете заставить его работать (см. Ответы на Постоянная библиотека комнаты Android - как вставить класс, у которого есть поле объекта List), но ваши данные определенно достаточно сложны, чтобы я не пытался использовать один класс как для JSON, так и для Комната; в итоге получится очень ненормализованная база данных.

person Alexey Romanov    schedule 29.11.2019
comment
Спасибо за ваш ответ. Очень полезно. @ Алексей Романов - person nimondo; 24.08.2020