Разбор JSON с сервера с картографическими данными - PullRequest
0 голосов
/ 07 декабря 2018

Я сейчас создаю приложения, используя Retrofit и Kotlin .Пока что я могу анализировать JSON с офисного сервера.Но теперь у меня проблема с отображением данных.Я уже читал о карте Котлина, но не могу полностью понять это.Для моего JSON с сервера я не могу загрузить его, потому что есть конфиденциальность данных моей компании.Итак, я буду использовать фиктивный JSON, но структура такая же, как у JSON моей компании.Вот оно:

{"market":
   "101":
      {"name": "xxx",
       "image": "/folderPath/imageName.jpg"
      }
   "102":
      {"name": "yyy",
       "image": "/folderPath/image2Name.jpg"
      }
}

О классе данных, я использую List <> для инициализации класса данных, вот оно:

data class Product(
  @SerializedName("Market") val Market: List<MarketContent> = listOf()
)

data class MarketContent(
  @SerializedName("Name") val Name: String,
  @SerializedName("Image") val Image: String
)

То, что я пробовал в моем RecyclerViewАдаптер выглядит следующим образом:

class OtherProductAdapter(private val otherProductList: List<MarketContent>, private val clickListener: (MarketContent) -> Unit) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.other_product, parent, false)
    return ListOther(v)
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    (holder as ListOther).bindItem(otherProductList[position], clickListener)
}

override fun getItemCount() = otherProductList.size

class ListOther(itemView: View) : RecyclerView.ViewHolder(itemView){

    private val rImg = itemView.findViewById<ImageView>(R.id.rv_image)

    fun bindItem(t: MarketContent, clickListener: (MarketContent) -> Unit){
        itemView.rv_title.text = t.Name
        Glide.with(itemView.context).load("http://192.168.1.100:3232" +t.Image).into(rImg)
        itemView.setOnClickListener {clickListener(t)}
    }
}
}

А вот и моя модификация

private fun getInto() {
    val apiService = ProductApiService()
    disposable =
            apiService.syncData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                    { result -> intoData(result) },
                    { error -> Log.e("Error", error.message) }
                )
}

private fun intoData(result: Product) {
    rv_view?.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
    rv_view?.hasFixedSize()
    rv_view?.adapter = OtherProductAdapter(result.Market, { item: MarketContent -> clickedItem(item) })
}

В результате мое приложение не показывает никаких данных, и появляется сообщение:

E / Ошибка: java.lang.IllegalStateException: Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1 столбца 109719 path $ .Market

Помогите мне, как я должен отобразить данные JSON.Заранее спасибо.

1 Ответ

0 голосов
/ 07 декабря 2018

Кажется, вам нужно изменить отображение как

@SerializedName("Market") val Market: Map<String, MarketContent> = mapOf()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...