{"id":1002,"date":"2025-07-26T08:00:11","date_gmt":"2025-07-26T08:00:11","guid":{"rendered":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/"},"modified":"2025-07-26T08:00:11","modified_gmt":"2025-07-26T08:00:11","slug":"paging-library-efficiently-loading-large-datasets-in-lists","status":"publish","type":"post","link":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/","title":{"rendered":"Paging Library: Efficiently Loading Large Datasets in Lists"},"content":{"rendered":"<h1>Paging Library: Efficiently Loading Large Datasets in Lists \ud83d\udcc8<\/h1>\n<p>Working with large datasets in Android applications can be a challenge. Displaying all data at once leads to performance issues, poor user experience, and potential out-of-memory errors. The <strong>Paging Library for large datasets<\/strong>, part of Android Jetpack, offers a robust solution for loading and displaying data in manageable chunks, improving both performance and the user experience. This tutorial will guide you through the fundamentals of the Paging Library and demonstrate how to implement it effectively in your Android projects.<\/p>\n<h2>Executive Summary \u2728<\/h2>\n<p>The Android Paging Library is essential for handling large datasets in applications, preventing UI freezes and memory issues. This library supports features such as asynchronous data loading, RecyclerView integration, and configurable prefetching. By breaking down data into pages, the Paging Library allows your app to load and display only what&#8217;s needed at any given time, leading to a smoother, more responsive user interface. This approach is particularly beneficial when dealing with data from network requests or large local databases. This tutorial will cover how to implement Paging 3, the latest version, using Kotlin and Java, ensuring you have a solid understanding of how to leverage this powerful tool in your Android development projects.<\/p>\n<h2>Understanding the Paging Library Architecture \ud83d\udca1<\/h2>\n<p>The Paging Library architecture consists of several key components that work together to efficiently load and display data. Understanding these components is crucial for effective implementation.<\/p>\n<ul>\n<li><strong>PagingSource:<\/strong> This component defines the source of your data and how to retrieve pages of data. It&#8217;s responsible for fetching data from a network or local database.<\/li>\n<li><strong>RemoteMediator:<\/strong> Used when you want to cache network data to a local database. It orchestrates the fetching and caching of data from a remote source.<\/li>\n<li><strong>Pager:<\/strong> This component creates a reactive stream of PagingData instances. It&#8217;s the central component for configuring and managing the paging process.<\/li>\n<li><strong>PagingData:<\/strong> A container for a page of data. It&#8217;s emitted by the Pager and consumed by the PagingDataAdapter.<\/li>\n<li><strong>PagingDataAdapter:<\/strong> A RecyclerView.Adapter that displays PagingData. It automatically handles placeholders, loading states, and data updates.<\/li>\n<\/ul>\n<h2>Setting Up Your Project \ud83d\udee0\ufe0f<\/h2>\n<p>Before you can start using the Paging Library, you need to add the necessary dependencies to your project. Make sure you&#8217;re using Android Studio and have a basic understanding of Kotlin or Java.<\/p>\n<ul>\n<li>Add the Paging Library dependencies to your app&#8217;s `build.gradle` file:<\/li>\n<\/ul>\n<pre><code class=\"language-gradle\">\ndependencies {\n    implementation(\"androidx.paging:paging-runtime-ktx:3.3.0\") \/\/ For Kotlin\n    \/\/ alternatively - without Android dependencies for Compose\n    implementation(\"androidx.paging:paging-common-ktx:3.3.0\")\n\n    \/\/ For Java, use the following\n    \/\/ implementation(\"androidx.paging:paging-runtime:3.3.0\")\n}\n<\/code><\/pre>\n<ul>\n<li>Sync your Gradle project to download and install the dependencies.<\/li>\n<li>Ensure you have a RecyclerView in your layout file to display the paged data.<\/li>\n<\/ul>\n<h2>Implementing a PagingSource \u2705<\/h2>\n<p>The <code>PagingSource<\/code> is responsible for fetching data from your data source. You need to override the <code>load()<\/code> function to define how to retrieve data based on a <code>LoadParams<\/code> object.<\/p>\n<ul>\n<li>Create a class that extends <code>PagingSource&lt;Int, YourDataType&gt;<\/code>, where <code>Int<\/code> is the key type (usually page number) and <code>YourDataType<\/code> is the type of data you&#8217;re loading.<\/li>\n<li>Implement the <code>getRefreshKey()<\/code> function to define how to refresh the data when the RecyclerView is refreshed.<\/li>\n<li>Override the <code>load()<\/code> function to fetch data based on the <code>LoadParams<\/code>.<\/li>\n<\/ul>\n<pre><code class=\"language-kotlin\">\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\n\nclass MyPagingSource : PagingSource&lt;Int, String&gt;() {\n\n    override suspend fun load(params: LoadParams&lt;Int&gt;): LoadResult&lt;Int, String&gt; {\n        val pageNumber = params.key ?: 1\n        val pageSize = params.loadSize\n\n        return try {\n            val data = fetchData(pageNumber, pageSize) \/\/ Replace with your data fetching logic\n\n            LoadResult.Page(\n                data = data,\n                prevKey = if (pageNumber == 1) null else pageNumber - 1,\n                nextKey = if (data.isEmpty()) null else pageNumber + 1\n            )\n        } catch (e: Exception) {\n            LoadResult.Error(e)\n        }\n    }\n\n    override fun getRefreshKey(state: PagingState&lt;Int, String&gt;): Int? {\n        \/\/ Try to find the key closest to the most recently accessed index\n        \/\/ within the list. Anchor position is the index with the most recent load.\n        return state.anchorPosition?.let { anchorPosition -&gt;\n            state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)\n                ?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)\n        }\n    }\n\n    private suspend fun fetchData(page: Int, pageSize: Int): List&lt;String&gt; {\n        \/\/ Simulate data fetching from a network or database\n        delay(1000) \/\/ Simulate network delay\n        val startIndex = (page - 1) * pageSize\n        val endIndex = minOf(startIndex + pageSize, 100) \/\/ Limit to 100 items\n\n        return (startIndex until endIndex).map { \"Item $it\" }\n    }\n}\n<\/code><\/pre>\n<p>In this example, <code>fetchData()<\/code> simulates fetching data from a remote source.  You&#8217;ll replace this with your actual data fetching logic, perhaps using Retrofit to call a REST API, or querying a Room database.<\/p>\n<h2>Creating a Pager Instance \ud83c\udfaf<\/h2>\n<p>The <code>Pager<\/code> instance is responsible for creating a stream of <code>PagingData<\/code>. You configure the pager with a <code>PagingConfig<\/code> and your <code>PagingSource<\/code>.<\/p>\n<ul>\n<li>Create a <code>Pager<\/code> instance using the <code>Pager()<\/code> constructor.<\/li>\n<li>Configure the <code>PagingConfig<\/code> with parameters such as <code>pageSize<\/code>, <code>prefetchDistance<\/code>, and <code>initialLoadSize<\/code>.<\/li>\n<li>Use the <code>flow<\/code> property of the <code>Pager<\/code> to get a <code>Flow&lt;PagingData&lt;YourDataType&gt;&gt;<\/code>.<\/li>\n<\/ul>\n<pre><code class=\"language-kotlin\">\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport kotlinx.coroutines.flow.Flow\n\nclass MyRepository {\n\n    fun getData(): Flow&lt;PagingData&lt;String&gt;&gt; {\n        return Pager(\n            config = PagingConfig(\n                pageSize = 20,\n                prefetchDistance = 2,\n                enablePlaceholders = false,\n                initialLoadSize = 20\n            ),\n            pagingSourceFactory = { MyPagingSource() }\n        ).flow\n    }\n}\n<\/code><\/pre>\n<p>The <code>PagingConfig<\/code> parameters control how data is loaded and displayed.  <code>pageSize<\/code> determines the number of items loaded per page, <code>prefetchDistance<\/code> specifies how many items before the end of the list to start loading the next page, and <code>enablePlaceholders<\/code> enables or disables placeholders while data is loading.<\/p>\n<h2>Integrating with RecyclerView \ud83d\udcc8<\/h2>\n<p>The <code>PagingDataAdapter<\/code> is a RecyclerView adapter that seamlessly integrates with the Paging Library. It automatically handles loading states, placeholders, and data updates.<\/p>\n<ul>\n<li>Create a class that extends <code>PagingDataAdapter&lt;YourDataType, YourViewHolder&gt;<\/code>.<\/li>\n<li>Override the <code>onCreateViewHolder()<\/code> and <code>onBindViewHolder()<\/code> functions as you would with a regular RecyclerView adapter.<\/li>\n<li>Implement the <code>areItemsTheSame()<\/code> and <code>areContentsTheSame()<\/code> functions in a <code>DiffUtil.ItemCallback<\/code> to efficiently update the RecyclerView.<\/li>\n<\/ul>\n<pre><code class=\"language-kotlin\">\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\n\nclass MyPagingAdapter : PagingDataAdapter&lt;String, MyPagingAdapter.MyViewHolder&gt;(DIFF_CALLBACK) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {\n        val view = LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)\n        return MyViewHolder(view)\n    }\n\n    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {\n        val item = getItem(position)\n        holder.bind(item)\n    }\n\n    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {\n        private val textView: TextView = itemView.findViewById(android.R.id.text1)\n\n        fun bind(item: String?) {\n            textView.text = item ?: \"Loading...\"\n        }\n    }\n\n    companion object {\n        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback&lt;String&gt;() {\n            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {\n                return oldItem == newItem \/\/ Replace with your item comparison logic\n            }\n\n            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {\n                return oldItem == newItem \/\/ Replace with your content comparison logic\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>The <code>DIFF_CALLBACK<\/code> ensures that the RecyclerView is updated efficiently by only updating the items that have changed. Replace the example comparison logic with your own to accurately compare your data types.<\/p>\n<h2>Collecting Data in Your Activity or Fragment \ud83d\udcf2<\/h2>\n<p>In your Activity or Fragment, you need to collect the <code>PagingData<\/code> from the <code>Pager<\/code> and submit it to the <code>PagingDataAdapter<\/code>.<\/p>\n<ul>\n<li>Create an instance of your <code>PagingAdapter<\/code>.<\/li>\n<li>Collect the <code>PagingData<\/code> from the <code>Flow<\/code> using <code>collectLatest<\/code> in a coroutine scope.<\/li>\n<li>Submit the <code>PagingData<\/code> to the <code>PagingAdapter<\/code> using the <code>submitData()<\/code> function.<\/li>\n<\/ul>\n<pre><code class=\"language-kotlin\">\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.PagingData\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var recyclerView: RecyclerView\n    private lateinit var adapter: MyPagingAdapter\n    private val repository = MyRepository()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        recyclerView = findViewById(R.id.recyclerView)\n        recyclerView.layoutManager = LinearLayoutManager(this)\n        adapter = MyPagingAdapter()\n        recyclerView.adapter = adapter\n\n        lifecycleScope.launch {\n            repository.getData().collectLatest { pagingData: PagingData&lt;String&gt; -&gt;\n                adapter.submitData(pagingData)\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>This code collects the <code>PagingData<\/code> and submits it to the adapter whenever a new page of data is available.  The <code>collectLatest<\/code> operator ensures that only the latest emission is processed, preventing potential issues with outdated data.<\/p>\n<h2>FAQ \u2753<\/h2>\n<h2>FAQ \u2753<\/h2>\n<ul>\n<li>\n<h3>Q: How do I handle loading states and errors?<\/h3>\n<p><strong>A:<\/strong> The Paging Library provides a <code>LoadStateAdapter<\/code> that you can use to display loading indicators and error messages. You can attach a <code>LoadStateAdapter<\/code> to your RecyclerView using the <code>withLoadStateHeaderAndFooter()<\/code> or <code>withLoadStateFooter()<\/code> functions. This allows you to display appropriate UI elements when data is loading or when an error occurs.<\/p>\n<\/li>\n<li>\n<h3>Q: Can I use the Paging Library with a local database?<\/h3>\n<p><strong>A:<\/strong> Yes, you can use the Paging Library with a local database. You need to implement a <code>PagingSource<\/code> that fetches data from your database. The Paging Library works well with Room, allowing you to easily create a <code>PagingSource<\/code> from a Room query. This ensures efficient loading of data from your local storage.<\/p>\n<\/li>\n<li>\n<h3>Q: How do I handle search functionality with the Paging Library?<\/h3>\n<p><strong>A:<\/strong> To implement search functionality, you can modify your <code>PagingSource<\/code> to filter the data based on a search query. When the search query changes, you can invalidate the <code>PagingSource<\/code> to trigger a refresh of the data. This allows you to efficiently display search results in your RecyclerView.<\/p>\n<\/li>\n<\/ul>\n<h2>Conclusion \ud83c\udf89<\/h2>\n<p>The <strong>Paging Library for large datasets<\/strong> provides a powerful and efficient way to handle large datasets in your Android applications. By loading data in manageable chunks, it improves performance, enhances the user experience, and prevents potential out-of-memory errors. By understanding the key components, such as <code>PagingSource<\/code>, <code>Pager<\/code>, and <code>PagingDataAdapter<\/code>, you can effectively implement the Paging Library in your projects. Whether you&#8217;re fetching data from a network or a local database, the Paging Library will help you create a smoother and more responsive user interface. Embrace the Paging Library to take your Android app&#8217;s data handling to the next level.<\/p>\n<h3>Tags<\/h3>\n<p>    Android, Paging Library, RecyclerView, Kotlin, Data Pagination<\/p>\n<h3>Meta Description<\/h3>\n<p>    Learn how to use Android&#8217;s Paging Library to efficiently load and display large datasets in lists. Improve performance &amp; UX.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Paging Library: Efficiently Loading Large Datasets in Lists \ud83d\udcc8 Working with large datasets in Android applications can be a challenge. Displaying all data at once leads to performance issues, poor user experience, and potential out-of-memory errors. The Paging Library for large datasets, part of Android Jetpack, offers a robust solution for loading and displaying data [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3850],"tags":[92,4069,4070,2898,3854,564,4067,753,4068,4071],"class_list":["post-1002","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-data-pagination","tag-efficient-loading","tag-java","tag-kotlin","tag-large-datasets","tag-paging-library","tag-performance-optimization","tag-recyclerview","tag-ux-design"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.0 (Yoast SEO v25.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Paging Library: Efficiently Loading Large Datasets in Lists - Developers Heaven<\/title>\n<meta name=\"description\" content=\"Learn how to use Android\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Paging Library: Efficiently Loading Large Datasets in Lists\" \/>\n<meta property=\"og:description\" content=\"Learn how to use Android\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/\" \/>\n<meta property=\"og:site_name\" content=\"Developers Heaven\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-26T08:00:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/via.placeholder.com\/600x400?text=Paging+Library+Efficiently+Loading+Large+Datasets+in+Lists\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/\",\"url\":\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/\",\"name\":\"Paging Library: Efficiently Loading Large Datasets in Lists - Developers Heaven\",\"isPartOf\":{\"@id\":\"https:\/\/developers-heaven.net\/blog\/#website\"},\"datePublished\":\"2025-07-26T08:00:11+00:00\",\"author\":{\"@id\":\"\"},\"description\":\"Learn how to use Android\",\"breadcrumb\":{\"@id\":\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developers-heaven.net\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Paging Library: Efficiently Loading Large Datasets in Lists\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/#website\",\"url\":\"https:\/\/developers-heaven.net\/blog\/\",\"name\":\"Developers Heaven\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developers-heaven.net\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Paging Library: Efficiently Loading Large Datasets in Lists - Developers Heaven","description":"Learn how to use Android","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/","og_locale":"en_US","og_type":"article","og_title":"Paging Library: Efficiently Loading Large Datasets in Lists","og_description":"Learn how to use Android","og_url":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/","og_site_name":"Developers Heaven","article_published_time":"2025-07-26T08:00:11+00:00","og_image":[{"url":"https:\/\/via.placeholder.com\/600x400?text=Paging+Library+Efficiently+Loading+Large+Datasets+in+Lists","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/","url":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/","name":"Paging Library: Efficiently Loading Large Datasets in Lists - Developers Heaven","isPartOf":{"@id":"https:\/\/developers-heaven.net\/blog\/#website"},"datePublished":"2025-07-26T08:00:11+00:00","author":{"@id":""},"description":"Learn how to use Android","breadcrumb":{"@id":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developers-heaven.net\/blog\/paging-library-efficiently-loading-large-datasets-in-lists\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developers-heaven.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Paging Library: Efficiently Loading Large Datasets in Lists"}]},{"@type":"WebSite","@id":"https:\/\/developers-heaven.net\/blog\/#website","url":"https:\/\/developers-heaven.net\/blog\/","name":"Developers Heaven","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developers-heaven.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts\/1002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/comments?post=1002"}],"version-history":[{"count":0,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts\/1002\/revisions"}],"wp:attachment":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/media?parent=1002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/categories?post=1002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/tags?post=1002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}