0

I am trying to get response from server which is in form of JSON with Swift 4.1 and Xcode 9.2. But the received JSON data by JSONDecoder is printing 531 bytes and giving error

dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))

my request task is

let itemUrl = URL(string: mainUrl.MainUrl + "viewallstore")
 let foodUrl = URLRequest(url: itemUrl!)
URLSession.shared.dataTask(with: foodUrl) { (data, response, error) in
            print(data ?? "Errrrr")
            if data != nil {
                do {
                    let storeDetails = try JSONDecoder().decode(AllStores.self, from: data!)
                    for store in storeDetails.StoreDetails {
                                           self.foods.append(FoodCourt(storeId: store.str_id, storeNo: store.str_number, storeName: store.str_name, storePhone: store.str_phone, storeParking: store.str_parking, storeOpenTime: store.str_open_time, storeCloseTime: store.str_close_tie, storeStartdate: store.str_open_date, storeCloseDate: store.str_close_date, storeLogoPath: store.str_logo_path, storeLogoFileName: store.str_logo_file_name, storeStatus: store.status, storeCategory: store.str_cat, createdAt: store.create_at, storeZone: store.str_zone, storeAvailability: store.str_availability, storeMulCategory: store.str_multiple_cat))
                    }
                }catch let error {
                    self.toastNeck(message: "\(error)")
                    print(error)
                    DispatchQueue.main.async{
                                            myActivityIndicator.stopAnimating()
                                            myActivityIndicator.hidesWhenStopped = true
                                        }
                }
                DispatchQueue.main.async {
                    self.collectionViewFoodCourt.reloadData()
                    }
            }

        }.resume()
}

and my struct is

struct AllStores: Decodable{

    let StoreDetails: [StoreDetail]

}

struct StoreDetail: Decodable {
    let str_id: String
    let str_number: String
    //let tid : String?  //tid
    let str_name: String
    let str_phone: String
    let str_parking: String
    let str_open_time: String
    let str_close_tie: String
    let str_open_date: String
    let str_close_date: String
    let str_logo_path: String
    let str_logo_file_name: String
    let status: String
    let str_cat: String
    let create_at: String
    let str_zone: String
    let str_availability: String
    let str_multiple_cat: String

    enum CodingKey: String {
        case str_id = "str_id"
        case str_number = "str_number"
        //case tid = "tid"
        case str_name = "str_name"
        case str_phone = "str_phone"
        case str_parking = "str_parking"
        case str_open_time = "str_open_time"
        case str_close_tie = "str_close_tie"
        case str_open_date = "str_open_date"
        case str_close_date = "str_close_date"
        case str_logo_path = "str_logo_path"
        case str_logo_file_name = "str_logo_file_name"
        case status = "status"
        case str_cat = "str_cat"
        case create_at = "create_at"
        case str_zone = "str_zone"
        case str_availability = "str_availability"
        case str_multiple_cat = "str_multiple_cat"
    }
}

and my json file on server is

{
    "StoreDetails": [
        {
            "str_id": "1",
            "str_number": "0",
            "tid": "",
            "str_name": "Moti mahal",
            "str_des": "",
            "str_phone": "9540011581",
            "str_add": "",
            "str_parking": "Ground Floor",
            "str_short_dis": "Moti Mahal",
            "str_open_time": "10:00:00",
            "str_close_tie": "23:00:00",
            "str_open_date": "2017-01-29",
            "str_close_date": "2018-01-28",
            "str_logo_path": "",
            "str_logo_file_name": "Moti mahal.png",
            "status": "Y",
            "str_cat": "1",
            "company_id": "0",
            "str_lat": "0",
            "str_lon": "0",
            "create_at": "2017-02-11 19:45:28",
            "create_by": "0",
            "str_zone": "1",
            "str_floor": "0",
            "str_availability": "1",
            "str_multiple_cat": "1"
        },
        {
            "str_id": "2",
            "str_number": "0",
            "tid": "",
            "str_name": "Ever Green",
            "str_des": "",
            "str_phone": "9953487923",
            "str_add": "",
            "str_parking": "Green Floor",
            "str_short_dis": "Snakes",
            "str_open_time": "10:00:00",
            "str_close_tie": "22:00:00",
            "str_open_date": "2017-02-05",
            "str_close_date": "2017-12-31",
            "str_logo_path": "",
            "str_logo_file_name": "Ever Green.jpg",
            "status": "N",
            "str_cat": "1",
            "company_id": "0",
            "str_lat": "0",
            "str_lon": "0",
            "create_at": "2018-01-15 22:20:11",
            "create_by": "0",
            "str_zone": "1",
            "str_floor": "0",
            "str_availability": "1",
            "str_multiple_cat": "1"
        }
]
}

the same json file is working fine in android but not working in iOS. I am stuck here from a very long time. All the other questions on StackOverflow is stating that my JSON file is not valid but it's working elsewhere.

Note. Feel free to edit my question if there any issues.

I have gone through all the similar questions but none of them is working in my scenario.

Neck
  • 611
  • 1
  • 7
  • 21
  • In the `catch let error` scope, do `let dataString = String.init(data:data, encoding: .utf8)` and check if it's really valid. It could be due to some header you didn't put in your request like asking specificly for JSON. – Larme Apr 25 '18 at 09:48
  • @Larme it is giving error: 404 Page Not Found

    404 Page Not Found

    The page you are looking for could not be found. Check the address bar to ensure your URL is spelled correctly. If all else fails, you can visit our home page at the link below.

    Visit the Home Page
    – Neck Apr 25 '18 at 10:52
  • So that’s normal. Chek the URL then. – Larme Apr 25 '18 at 10:53
  • @Larme as I mentioned earlier the url is working in Android Project and Postman. – Neck Apr 25 '18 at 10:54
  • Postman might add by itself accept content like application/json in headers... – Larme Apr 25 '18 at 11:05
  • thanks @Larme for ideas. Looks like I was missing POST request, because the url I am using is a bound url, it won't open on browser. – Neck Apr 25 '18 at 11:11

1 Answers1

0

solved the issue, just needed to add POST request to the URL

foodUrl.httpMethod = "POST"
Neck
  • 611
  • 1
  • 7
  • 21