Как получить доступ к значению ключа внутри ключа в ответе JSON в Android, загруженном с Retrofit2? - PullRequest
0 голосов
/ 02 сентября 2018

Я получаю доступ к API WordPress для извлечения сообщений с помощью Retrofit2, а затем при попытке присвоить значения представлениям в моем адаптере:

inner class MainActivityViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    fun bind(post: Post) {
        with(post) {
            itemView.tv_post_title.text = title
            itemView.tv_post_date.text = date
            itemView.tv_post_content.text = content
        }
    }
}

Retrofit's GET возвращает Observable, и поэтому при попытке присвоения отображается следующая ошибка в onErrorResumeNext:

java.lang.IllegalStateException: ожидаемая строка, но была BEGIN_OBJECT в строке 1 столбца 373 пути $ [0] .title

Это потому, что ключ title содержит ключ rendered:

{  
  id:497,
  date:"2018-04-08T03:34:12",
  [...]
  title:{  
    rendered:"Lorem ipsum dolor sit amet"
  }
}

То же самое относится к content и excerpt. Как мне получить доступ к этим rendered ключам? Я пробовал что-то вроде

val title: JsonElement = JsonParser (). Parse (post.title)

но сохраняется та же ошибка.

1 Ответ

0 голосов
/ 02 сентября 2018

Это происходит потому, что анализатор json не может проанализировать титровальный объект.

java.lang.IllegalStateException: ожидаемая строка, но была BEGIN_OBJECT в строке 1 столбца 373 пути $ [0] .title

Чтобы избежать этой ошибки во время выполнения, нажмите здесь, чтобы создать java pojo для ожидаемого json , а затем используйте его в качестве типа возврата в вашем API для модификации.

Попробуйте использовать следующие java pojo для вашего json, который создан с помощью вышеупомянутого инструмента.

Post.kt

data class Post(
    @PrimaryKey(autoGenerate = true)
    @SerializedName("id")
    val id: Int,

    @SerializedName("title")
    @Embedded
    val title: Title,

    @SerializedName("excerpt")
    @Embedded
    val excerpt: Excerpt,

    @SerializedName("content")
    @Embedded
    val content: Content,

    @SerializedName("date")
    val date: String,

    @SerializedName("modified")
    val modified: String
)

Content.kt

class Content {
    @SerializedName("rendered")
    var content: String? = null
}

Title.kt

class Title {
    @SerializedName("rendered")
    var title: String? = null
}

Excerpt.kt

class Excerpt {
    @SerializedName("rendered")
    var excerpt: String? = null
}

Импорт следующей зависимости для Gson

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@ SerializedName: Дайте возможность сопоставить ключ JSON с переменной-членом java, имя которой отличается от имени ключа JSON. Проверить этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...