Home > Mobile >  Retrieve Array from Firebase Firestore using REST API on iOS
Retrieve Array from Firebase Firestore using REST API on iOS

Time:07-10

I'm using REST APIs to retrieve data from my Firestore DB. I'm forced to use REST API instead of the Firebase SDK since App Clip don't allow to use the latter.

The JSON file is the following: JSON File

And, as text:

{
  "name": "projects/myProject/databases/(default)/documents/Brand/rxnBLnp736gqjFBNLxxx",
  "fields": {
    "descrizione": {
      "stringValue": "My project Brand Demo"
    },
    "descrizione_en": {
      "stringValue": "My project Brand Demo"
    },
    "listaRefsLinea": {
      "arrayValue": {
        "values": [
          {
            "referenceValue": "projects/myProject/databases/(default)/documents/Linea/aeeDNuY9xEvRvyM5cxxx"
          }
        ]
      }
    },
    "data_consumption": {
      "stringValue": "7xpISf0XxRnfrnUkNxxx"
    },
    "url_logo": {
      "stringValue": "gs://myproject.appspot.com/FCMImages/app-demo-catalogue.png"
    },
    "web_url": {
      "stringValue": "www.mybrand.it"
    },
    "nome_brand": {
      "stringValue": "My project Demo"
    }
  },
  "createTime": "2021-05-19T10:34:51.828685Z",
  "updateTime": "2022-05-24T14:03:16.121296Z"
}

And I'm decoding it as follows:

import Foundation

struct BrandResponse : Codable {
    let brands : [Brand_Struct]
    
    private enum CodingKeys : String, CodingKey {
        case brands = "documents"
    }
}

struct StringValue : Codable {
    let value : String
    
    private enum CodingKeys : String, CodingKey {
        case value = "stringValue"
    }
}

struct Brand_Struct : Codable {
    let url_logo : String
    let web_url : String
    let nome_brand : String
    let descrizione : String
    let listaRefsLinea : [String]
    let descrizione_en : String
    let data_consumption : String
    
    private enum BrandKeys : String, CodingKey {
        case fields
        case listaRefsLinea
    }
    
    private enum FieldKeys : String, CodingKey {
        case url_logo
        case web_url
        case nome_brand
        case descrizione
        case listaRefsLinea
        case descrizione_en
        case data_consumption
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: BrandKeys.self)
        
        let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields)
        
        //listaRefsLinea = try containerListaRefsLinea_2.decode(ArrayValue.self, forKey: .values).referenceValue
        nome_brand = try fieldContainer.decode(StringValue.self, forKey: .nome_brand).value
        web_url = try fieldContainer.decode(StringValue.self, forKey: .web_url).value
        url_logo = try fieldContainer.decode(StringValue.self, forKey: .url_logo).value
        descrizione = try fieldContainer.decode(StringValue.self, forKey: .descrizione).value
        descrizione_en = try fieldContainer.decode(StringValue.self, forKey: .descrizione_en).value
        data_consumption = try fieldContainer.decode(StringValue.self, forKey: .data_consumption).value
        listaRefsLinea = [""] // <-- How to read this??
    }
    
}

My issue is that I'm not being able to read the array inside the field "listaRefsLinea". Any idea on how to achieve that? Also I'm afraid that part of the troubles come from the fact that that's a Document Reference variable and as such does not conform to the Codable protocol.

CodePudding user response:

Well. listaRefsLinea is a custom object just like your StringValue

So add these structs:

// MARK: - ListaRefsLinea
struct ListaRefsLinea: Codable {
    let arrayValue: ArrayValue
}

// MARK: - ArrayValue
struct ArrayValue: Codable {
    let values: [Value]
}

// MARK: - Value
struct Value: Codable {
    let referenceValue: String
}

and in your custom init decode it to this struct, go down the tree until you get the array and map that to a [String]:

listaRefsLinea = try fieldContainer.decode(ListaRefsLinea.self, forKey: .listaRefsLinea)
    .arrayValue.values.map{ $0.referenceValue }
  • Related