SwiftInstagram icon indicating copy to clipboard operation
SwiftInstagram copied to clipboard

JSON parser breaks when parsing ids of locations within photo tags

Open fer662 opened this issue 6 years ago • 3 comments

(lldb) po error
▿ DecodingError
  ▿ dataCorrupted : Context
    ▿ codingPath : 4 elements
      - 0 : CodingKeys(stringValue: "data", intValue: nil)
      ▿ 1 : _JSONKey(stringValue: "Index 4", intValue: 4)
        - stringValue : "Index 4"
        ▿ intValue : Optional<Int>
          - some : 4
      - 2 : CodingKeys(stringValue: "location", intValue: nil)
      - 3 : CodingKeys(stringValue: "id", intValue: nil)
    - debugDescription : "Parsed JSON number <531383683876521> does not fit in Int."
    - underlyingError : nil

Instagram sends strings for ids for pretty much everything, but it seems it sends ints for locations. Huge ints at that. They don't fit in 64 bits and the swift parser doesn't like that at all.

Edited/censored offending JSON. The data within the location node hasn't been altered:

{
	"pagination": {
		"next_max_id": "censored",
		"next_url": "censored"
	},
	"data": [{
		"id": "123123123_123123123",
		"user": {
			"id": "12345678",
			"full_name": "Censored",
			"profile_picture": "censored",
			"username": "censored"
		},
		"images": {
			"thumbnail": {
				"width": 150,
				"height": 150,
				"url": "censored"
			},
			"low_resolution": {
				"width": 320,
				"height": 320,
				"url": "censored"
			},
			"standard_resolution": {
				"width": 640,
				"height": 640,
				"url": "censored"
			}
		},
		"created_time": "1515524886",
		"caption": {
			"id": "12345678",
			"text": "censored",
			"created_time": "1515524886",
			"from": {
				"id": "1297516609",
				"full_name": "Censored",
				"profile_picture": "censored",
				"username": "censored"
			}
		},
		"user_has_liked": false,
		"likes": {
			"count": 17
		},
		"tags": [],
		"filter": "Normal",
		"comments": {
			"count": 0
		},
		"type": "image",
		"link": "censored",
		"location": {
			"latitude": -22.951586524616,
			"longitude": -43.210792243481,
			"name": "Cristo Redentor Rio de Janeiro",
			"id": 531383683876521
		},
		"attribution": null,
		"users_in_photo": []
	}],
	"meta": {
		"code": 200
	}
}

fer662 avatar Apr 20 '18 13:04 fer662

It can be resolved by using InstagramLocation<Decimal> instead of InstagramLocation<Int> in 2 relevant places.

fer662 avatar Apr 20 '18 13:04 fer662

Hi @fer662, I'm afraid I don't understand your solution. Could you give me more details?

AnderGoig avatar Apr 21 '18 15:04 AnderGoig

I meant to say InstagramLocation<Int> to InstagramLocation<Decimal> but i might have hit some kind of markup. There!

fer662 avatar Apr 21 '18 17:04 fer662